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

C# 我有一个关于数据序列化的复杂难题,c#,serialization,unity3d,C#,Serialization,Unity3d,(C#和Unity)我已经有一款游戏上市了,我需要通过添加新内容来更新它。我有一个带有列表的类,该列表将我的所有保存类添加到,使用binaryformatter对其进行序列化,并在加载时对其进行反序列化和恢复数据 我现在遇到的问题是,我正在使用内存流的tobase64字符串的导出来允许玩家备份他们的数据。这造成了一个无法预料的复杂情况,我不能再允许他们使用这种方法重新加载数据 我无法将新类添加到先前存在的对象列表中,否则会破坏保存的数据。 我无法将新变量添加到先前保存的类中,否则会破坏保存的数据

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

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

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

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

现在改变我保存和加载数据的方式已经太晚了,所以我需要以某种方式处理我已经拥有的数据。因为我只限于统一和Monobehavior的可爱,C++不是一个选项。 我希望你能理解我的问题我尽力解释了


谢谢您的时间。

在新版本的程序中,您可以尝试使用新旧方法反序列化数据,并嗅探反序列化的数据以了解其意义。请参见

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

        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);

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

我不明白。保存和备份是两件不同的事情吗?序列化的两个对象是什么?您现在正在序列化什么,您希望序列化什么?改变任何东西都不会太迟,您可以通过在格式中添加版本号并在保存时将旧格式转换为新格式来读/写多种格式的数据。这两个对象是List savedData1和List savedData2。它们是包含多个不同类对象的列表。我需要添加另一个savedData对象列表,因为我的序列化当前只有一个。问题是,正如您在上面所读到的关于Base64String及其反序列化的内容,您说您有两个列表,然后您说您需要添加另一个列表,但您只有一个。那不是第三个吗?不完全是。我正在序列化两个列表,然后将内存流转换为SE64String。我需要对两个列表进行反序列化,但不知怎么区分这两个列表。我不明白。你读回一个列表,那是第一个,你读回另一个,那是第二个。你按照你写的顺序把它们拿回来。这是你唯一能区分的方法。我刚刚试过你说的话,它确实奏效了。我觉得自己现在是最大的弱智。我不知道它是这样工作的,但现在我知道了,我真的很感谢你花时间帮助我认识到我有多笨(但同时也教我)。你真棒!