我的对象有父子关系。每个子对象都有一个指向其容器的 Parent 属性。在应用程序中创建此对象时,它已设置,因此没有问题。此Parent属性标记为XmlIgnore属性,因为它需要设置为其运行时父实例。那么,在反序列化对象后初始化此Parent属性的最佳方法是什么?是否有'反序列化完成'事件或类似事件?
编辑:我在谈论C#WPF中的XmlSerializer。我不想要二进制序列化器。答案 0 :(得分:1)
XmlSerializer
不提供序列化回调,我担心。一种方法是让父在添加时处理这个问题 - 但是你需要一个自定义集合(可能是从Collection<T>
继承而来)Add
/ {{1调用子上的一些方法来添加(或删除,如果从集合中删除)父项。
或者 - 考虑简单地将其设为单向树 - 即孩子不拥有父母属性。
另一种选择是在反序列化后通过代码遍历模型,并修复任何父值。
最后一个选项是实施Remove
,但非常很难正确。
答案 1 :(得分:1)
您的问题在某些方面缺乏细节,但是根据您描述的某些属性和属性,我将假设您在.NET Framework中使用XMLSerializer
。
您可能知道OnDeserialized
attribute,您可以使用它来标记在反序列化对象后要调用的特定方法。不幸的是,这只适用于XMLSerializer
的二进制,SOAP和DataAttribute格式化程序,不是。
为了使用XMLSerializer
实现相同的功能,您必须自己在要序列化为XML的类上实现IXmlSerializable
interface。这将允许您完全控制如何序列化和反序列化类的实例,包括在反序列化对象后运行以初始化Parent
属性的代码。
CodeProject上有一篇很好的示例文章介绍了如何正确实现IXmlSerializable
可用here。