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

本文关键字:有一个 复杂 难题 序列化 数据 于数据 | 更新日期: 2023-09-27 18:29:49

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

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

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

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

现在改变我保存和加载数据的方式已经太晚了,所以我需要以某种方式使用我已经拥有的数据。由于我只局限于Unity和Monophavior的可爱之处,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);

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

在程序的新版本中,您可以尝试使用旧方法和新方法对数据进行反序列化,并探查反序列化的数据以了解其含义。请参阅http://en.wikipedia.org/wiki/Content_sniffing