关于数据的序列化,我有一个复杂的难题

时间:2014-11-08 06:15:42

标签: c# serialization unity3d

(C#和Unity)我已经在市场上玩了一款游戏,我需要通过添加新内容来更新它。我有一个带有列表的类,它将我的所有保存类添加到其中,使用binaryformatter对其进行序列化,并在加载时对其进行反序列化并恢复数据。

我现在遇到的问题是我正在使用内存流的ToBase64String导出来允许玩家备份他们的数据。这造成了一种无法预料的复杂问题,我不能让他们再使用这种方法重新加载他们的数据。

我无法将新类添加到预先存在的对象列表中,或者它会破坏保存的数据。 我无法将新变量添加到预先存在的已保存类中,也无法保存已保存的数据。 (我明白为什么它会这样做。) 我可以使用单独的内存流和字符串来序列化这两个对象来表示它们。但是,使用FromBase64String的导入重新加载不能用于此方法,除非我强迫玩家将二进制代码放入不同的框中,这会使他们感到困惑,因此它不是一个选项。

我需要知道的是,如果我忽略某种方式来反序列化包含两个对象的一个​​序列化Base64String,则在加载后获取这两个对象。问题是我只看到一种方法来获取已保存但不同时保存的第一个对象。

现在改变我保存和加载数据的方式为时已晚,因此我需要以某种方式使用我已有的工作。由于我仅限于Unity和Monobehavior的可爱性,因此C ++不是一种选择。

我希望你能理解我的要求我尽力解释它。

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

在程序的新版本中,您可以尝试使用旧方法和新方法反序列化数据,并嗅探反序列化数据以理解它。见http://en.wikipedia.org/wiki/Content_sniffing

答案 1 :(得分:0)

好的,如果我理解正确,您需要将多个对象序列化为字符串。这很简单,您可以将任意数量的对象序列化为内存流,并以相同的方式读取它:

        var bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
        var ms = new System.IO.MemoryStream();
        bf.Serialize(ms, DateTime.Now);
        bf.Serialize(ms, "hello world");
        var str = Convert.ToBase64String(ms.ToArray());

        ms = new System.IO.MemoryStream(Convert.FromBase64String(str));
        var obj1 = (DateTime)bf.Deserialize(ms);
        var obj2 = (string)bf.Deserialize(ms);

        Console.WriteLine(obj1);
        Console.WriteLine(obj2);

无论如何,我建议你实现某种数据格式版本控制。如果有新格式,请为其创建新对象,当您发布新版本的应用时,您可以回读旧格式的数据并将其转换为新格式。