【发布时间】:2011-04-04 02:53:26
【问题描述】:
我目前正在使用XmlSerializer,令人惊讶的是:) 处理我的数据结构的反序列化 - 我发现它非常易于使用,但以灵活性为代价。目前,我将它用于基于树的结构;由于XmlSerializer 不处理循环结构,我已将[XmlIgnore] 添加到我的Parent 属性中,并对树进行后反序列化迭代以修复节点父节点。
有没有更好的方法使用XmlSerializer 来处理这个问题,或者使用XmlReader/XmlWriter 重写代码会更好吗?我想实现IXmlSerializable 是可行的,但这似乎是相当多的工作,同时仍然保留了XmlSerializer 的缺点。
当前的后反序列化步骤没问题,但是我添加了一个必须序列化到单独的 XML 文件的数据结构:基本上是一个平面列表,需要一个 Parent 属性来引用上一个树结构中的节点.这还需要一个后反序列化步骤,以及在新数据结构中保留 Parent 属性和 ParentId(或一些技巧)。
那么,有什么聪明的(和非脆弱的)想法吗?还是XmlReader/XmlWriter是?
解决方案
DataContractSerializer 原来是一个相当不错的解决方案,与 XmlSerializer 几乎相同的简单性。我选择不使用自动循环处理,而是定义和OnDeserialized 装饰方法来处理设置父节点;这样,生成的 XML 就符合标准。
让我困惑了一段时间的一件事是,我在反序列化后在某些属性上崩溃了,支持成员设置为 null - 无法弄清楚这是怎么可能的,因为支持成员肯定在所有可能的构造函数中初始化.调试显示构造函数从未被调用过,经过一番谷歌搜索后,我找到了this SO post 的解释。
【问题讨论】:
标签: c# datacontractserializer xml-deserialization