【问题标题】:Example of Serialization in Unity; with different instances of the same classUnity中的序列化示例;具有同一类的不同实例
【发布时间】:2016-06-07 10:05:12
【问题描述】:

我很难找到一个关于序列化的示例,其中包含多个对象。

通常,这些示例显示了通过一个对象(通常是为了保存您要保存或加载的数据而创建的一个类)的序列化。这很好,但我找不到展示如何对更多对象进行序列化和反序列化的东西。

我正在设想一个类类型的不同实例的情况,所以我不确定在这种情况下如何反序列化。

这就是我序列化的方式:

BinaryFormatter savegame_formatter = new BinaryFormatter();

FileStream savefile = File.Open(Application.persistentDataPath +
                                "/savegame.dat", FileMode.Open);
savegame_formatter.Serialize(savefile, Player1Data);
savegame_formatter.Serialize(savefile, Player2Data);
savefile.Close();

两个序列化的类是同一个类(PlayerData);只有2个不同的实例;具有不同的价值。反序列化时,如何区分这2个实例?

BinaryFormatter loadgame_formatter = new BinaryFormatter();
FileStream loadfile = File.Open(Application.persistentDataPath + "/savegame.dat", FileMode.Open);
// How do you deserialize Player1Data and Player2Data?
PlayerData cloned = (PlayerData)loadgame_formatter.Deserialize(loadfile);

【问题讨论】:

  • 什么不使用 json 将所有内容写入文件并反序列化它们?
  • 会更简单吗?大多数示例都显示了二进制方法,尽管我从来没有处理过这种情况,所以我不确定为什么一个会比另一个更受欢迎。
  • 是的,这会更简单,这就是您应该这样做的方式。 BinaryFormatter 的例子很多,因为 Json 没有得到天真的支持。现在它是。如果你需要一个例子,请告诉我。只需使用 PlayerData 类的外观更新您的问题。

标签: c# serialization unity3d


【解决方案1】:

从外观上看,您正在覆盖保存文件。您想以附加模式打开。将您的保存数据实例放在列表或数组中也是一个好主意。然后你可以foreach他们,写入文件,在每次成功序列化后添加某种分隔符,然后使用相同的步骤,但反向进行反序列化(将文件读取到第一个分隔符,反序列化,重复)。或者,您可以为每个保存数据实例创建单独的保存文件。在这种情况下,使用相同的迭代数组策略。

【讨论】:

  • 对;我没有意识到我每次都在覆盖。除此之外,我认为没有直接的方法来反序列化多个对象,这些对象是我猜想的同一个对象的实例。多个保存文件会增加破坏的风险,这就是我尝试只使用一个文件的原因。
  • @newbiez 直接的方法是在单个文件中添加一些分隔符。然后阅读文本直到该分隔符。将该文本传递给反序列化,反序列化,将新对象放入数组中(或实现某种工厂),重复。
【解决方案2】:

感谢 Uri,我确实考虑过如何解决这个问题,并发现可以序列化字典,这样我就可以整齐地保存数据并解决问题。

而不是对多个对象进行多次调用来序列化;我可以简单地创建一个自定义字典,以<string, object> 为定义,并将整个字典作为序列化存储在外部文件中。

我现在就试试这个,看看是否有效。

【讨论】:

    猜你喜欢
    • 2021-06-25
    • 2021-07-18
    • 2013-11-13
    • 1970-01-01
    • 2019-09-23
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多