Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象xml反序列化问题?_C#_.net_Xml_Serialization_Xml Serialization - Fatal编程技术网

C# 对象xml反序列化问题?

C# 对象xml反序列化问题?,c#,.net,xml,serialization,xml-serialization,C#,.net,Xml,Serialization,Xml Serialization,我的对象具有父子关系。每个子对象都有一个指向其容器的父属性。在应用程序中创建此对象时,它已设置,因此没有问题。此父属性用XmlIgnore属性标记,因为需要将其设置为运行时父实例。那么,在对象反序列化之后,初始化父属性的最佳方法是什么?是否存在“反序列化已完成”事件或类似事件 编辑:我说的是C#WPF中的XmlSerializer。我不想要二进制序列化程序 XmlSerializer恐怕不提供序列化回调。一种方法是让父级在添加时处理此问题,但您需要一个自定义集合(可能继承自collection)

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


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

XmlSerializer
恐怕不提供序列化回调。一种方法是让父级在添加时处理此问题,但您需要一个自定义集合(可能继承自
collection
),该集合在
Add
/
Remove
过程中调用子级上的某个方法来添加(或删除,如果从集合中删除)父级

另一方面,考虑简单地把它变成一个单向的树——也就是说,这个孩子没有父属性。 另一种选择是在反序列化后遍历模型代码,并修复任何父值


最后一个选项是实现
IXmlSerializable
,但这很难做到正确。

您的问题有点缺乏细节,但从您描述的一些属性和属性来看,我将假设您在.NET框架中使用
XMLSerializer

您可能知道,可以使用它来标记要在对象反序列化后调用的特定方法。不幸的是,这只适用于二进制、SOAP和DataAttribute格式化程序,而不适用于
XMLSerializer

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


关于CodeProject有一篇很好的示例文章,介绍了如何正确实现
IXmlSerializable

您似乎在谈论一个特定的序列化库,但甚至没有说您使用的是什么语言。很抱歉我的疏忽。我已经更新了我的问题。谢谢你的输入。“另一种选择是在反序列化后遍历模型代码,并修复任何父值”。是的,这是我目前使用的方法,我不满意它,因为我有很多对象要序列化。事实上,在我正在进行的另一个项目中采用了这种方法——我不确定这是否是由于序列化问题。我觉得这种方法有一个主要缺陷,即对象不再是一个“对象”,而仅仅是一个数据结构,因为没有父对象,它在很多情况下不知道该做什么。我在寻找几年前使用的OnDeserialized属性,但我忘了它只用于二进制序列化。我想我必须考虑实现IXmlSerializable,因为我有很多对象要序列化。非常感谢你的回答。好的,我刚刚看了CodeProject的文章。我想我不会采取那种方法。不仅因为我有很多对象要序列化,而且序列化本身也没有任何问题。唯一缺少的是对象反序列化后的事件。我正在寻找一个简单、容易的解决方案。我想知道为什么微软决定不为XmlSerializer实现OnDeserialized属性。有什么解释吗?微软决定让XML(当然包括XML序列化)成为框架中完全独立的一部分。我想这就是原因,但我不确定这是否有帮助。如果是我的话,我很可能会玩个小游戏,想出一种使用二进制序列化的方法。也许您还可以考虑继承
XMLSerializer
并在重写的
反序列化方法中引发您自己的回调事件。恐怕没有简单易行的方法可以做到这一点。二进制序列化不是我的选择。我刚刚看过您关于继承XmlSerializer的建议,但意识到这项额外工作并不比我目前的方法好多少(在反序列化后调用函数来修复它)。非常感谢你的想法!