【问题标题】:How can I reconstruct the object hiearchy/references after XML deserialization in C#如何在 C# 中的 XML 反序列化后重建对象层次结构/引用
【发布时间】:2011-11-23 16:40:03
【问题描述】:

我正在构建一个游戏项目,其中包含可以有子对象的简单容器对象。我不知何故需要将游戏的“状态”和序列化保存到 XML。然后我将通过序列化 XML 来简单地加载游戏,但我需要保存对象、链接等的状态。实现这一点的最佳实践是什么?为了演示,想想这些:

GameObject Bag (ID 1234)
--------------
Sword (object ID 5678, some reference to another object in game: 0987)

等等。我有对象之间的游戏内引用,我需要在保存/加载到 XML 时保留此状态。在一个简单的场景中,我对 XML 序列化本身没有任何问题,但我不知道如何保留对象之间的“链接”。

【问题讨论】:

  • 它真的需要是XML吗? XML 是一种树格式...支持对象引用的 XML 序列化程序并不多。
  • 不,不一定,但如果它是 .NET 内置的东西(不是 3rd 方库),我会非常高兴
  • 提供此功能的唯一内置程序是:BinaryFormatter、DataContractSerializer(通过特定的构造函数 - 默认情况下未启用)和 NetDataContractSerializer。我同意 Anders 的观​​点,即 DataContractSerializer 是其中最合适的。各种 3rd 方序列化程序也可以,但您明确表示您选择不使用这些...有什么原因吗?
  • 我不想依赖任何不属于原始 .net(及其官方框架)的第三方库..
  • 那是您的决定,但社区工具实际上非常活跃且质量上乘;当然,通常由您来进行任何修复等,速度会更快。

标签: c# serialization xna xml-serialization deserialization


【解决方案1】:

使用支持引用的序列化程序。例如,DatacontractSerializer 可以做到这一点。 对于 xml,您可以在 DataContractSerializer 中启用它,例如 http://blogs.msdn.com/b/sowmy/archive/2006/03/26/561188.aspx

【讨论】:

  • 好的,让序列化程序工作,但由于我将解决的其他一些冲突而无法测试它(我需要一种序列化委托的方法,但这本身就是另一个问题),无论如何,是有什么额外的东西可以让参考文献工作,或者当我能让它工作时它会工作吗?
  • 在序列化委托时要记住一些事情(例如,当然不要引用您不想序列化的对象)。我也会尽可能避免对委托进行序列化。例如,如果对象 A 总是有一个对象的 Foo() 方法的委托,那么您只需要存储对该对象的引用,并且您可以在反序列化后再次重新创建委托。
  • 是的,好吧,想想完全保存状态,有很多方法(具有相同的签名),我的代表(为了简单起见,现在只有一个)指向其中一个。那么我需要一种方法来保存状态,关闭我的游戏,重新打开它并从头开始加载它,但是我如何存储诸如 CurrentAction = Walk (它的委托)之类的东西并将其加载回来?是存储字符串值然后将其加载回来的唯一方法吗?它的性能效率如何?它在实践中是如何完成的?有什么方法可以让序列化程序自动执行此操作,还是我的类中需要一个带有方法名称的字符串字段?
  • 有一个可能的动作的枚举,每个动作都由一个代表实现。仅保存枚举。 CurrentActionType = ActionType.Walk。然后,您可以重新绑定到反序列化的方法,或者实际上根本不重新绑定,而是从值中解析。对于这样的事情,我不认为委托是真正的“状态”,状态只是当前动作是“行走”的信息。因此,只需序列化它即可。
  • 我实际上得到了那部分,我需要一种方法将其放入序列化/反序列化中以使其尽可能自动化
【解决方案2】:

我手中没有真正的证据,但我有一个朋友使用YAML 进行树序列化,并且非常满意。

在文章的最后,您还可以找到对可用的 .NET 库的引用。

希望这会有所帮助。

【讨论】:

  • 看起来不错,但为了兼容性,内置的东西会更好。
  • 没错,但也要考虑这个选择(如果有时间的话),因为考虑到您正在开发游戏,这意味着您需要高速和低内存占用。
  • 其实,这看起来很有趣:codeproject.com/KB/recipes/yamlparser.aspx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 2016-05-27
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多