【问题标题】:Object xml deserialization issue?对象xml反序列化问题?
【发布时间】:2010-11-13 10:19:15
【问题描述】:

我的对象具有父子关系。每个子对象都有一个指向其容器的 Parent 属性。在应用程序中创建此对象时,它已设置,因此没有问题。此 Parent 属性用 XmlIgnore 属性标记,因为它需要设置为其运行时父实例。那么,在对象反序列化后初始化此 Parent 属性的最佳方法是什么?是否有“反序列化完成”事件或类似事件?

编辑:我说的是 C# WPF 中的 XmlSerializer。我不想要二进制序列化器。

【问题讨论】:

  • 您似乎在谈论特定的序列化库,但甚至没有说您使用的是什么语言。
  • 抱歉我的疏忽。我已经更新了我的问题。

标签: c# .net xml serialization xml-serialization


【解决方案1】:

您的问题有些缺乏细节,但根据您描述的一些属性和属性,我将假设您在 .NET Framework 中使用XMLSerializer

您可能知道OnDeserialized attribute,您可以使用它来标记您希望在对象被反序列化后调用的特定方法。不幸的是,这仅适用于 Binary、SOAP 和 DataAttribute 格式化程序,不适用于 XMLSerializer

为了使用XMLSerializer 实现相同的功能,您必须自己在要序列化为XML 的类上实现IXmlSerializable interface。这将允许您完全控制类的实例如何序列化和反序列化,包括在对象反序列化后运行以初始化 Parent 属性的代码。

CodeProject 上有一篇很好的示例文章,描述了如何正确实现IXmlSerializable,可用here

【讨论】:

  • 我正在寻找几年前使用过的 OnDeserialized 属性,但我忘记了它仅用于二进制序列化。我想我必须考虑实现 IXmlSerializable 因为我有很多对象要序列化。非常感谢您的回答。
  • 好吧,我只是看了一下 CodeProject 文章。我不认为我会采取这种方法。不仅因为我有很多对象要序列化,而且我对序列化本身没有任何问题。唯一缺少的是对象反序列化后的事件。我正在寻找一个简单,更容易的解决方案。我想知道为什么微软决定不为 XmlSerializer 实现 OnDeserialized 属性。有什么解释吗?
  • Microsoft 决定将 XML(当然包括 XML 序列化)作为框架的一个完全独立的部分。我想这就是解释,但我不确定这是否有帮助。如果是我,我可能会想办法使用二进制序列化。也许您还可以考虑继承 XMLSerializer 并在覆盖的 Deserialize 方法中引发您自己的回调事件。恐怕没有简单易行的方法来做到这一点。
  • 二进制序列化不是我的选择。我只是看了你关于继承 XmlSerializer 的建议,但意识到这个额外的工作并不比我目前的方法好多少(在反序列化之后调用一个函数来修复它)。非常感谢您的想法!
【解决方案2】:

XmlSerializer 恐怕不提供序列化回调。一种方法是让 parent 在添加时处理此问题 - 但您将需要一个自定义集合(可能继承自 Collection<T>),在 Add/Remove 期间调用一些方法要添加(或删除,如果从集合中删除)父级的子级。

或者 - 考虑简单地将其设为单向树 - 即子级没有 父级属性。

另一种选择是在反序列化后简单地通过代码遍历模型,并修复任何父值。

最后的选择是实现IXmlSerializable,但这非常很难做到。

【讨论】:

  • 感谢您的意见。 “另一种选择是在反序列化后简单地通过代码遍历模型,并修复任何父值”。是的,这是我目前使用的方法,我对它不满意,因为我有很多对象要序列化。
  • 关于“或者 - 考虑简单地使其成为单向树 - 即子级没有父级属性”的评论。事实上,在我正在进行的另一个项目中,我正在采用这种方法——我不确定这是否是由于序列化问题。我觉得这种方法的一个主要缺陷是对象不再是“对象”,而仅仅是一种数据结构,因为没有父对象,它在很多情况下不知道该做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
相关资源
最近更新 更多