稍微不平凡的数据结构:XmlSerializer适合我吗?

时间:2010-08-26 07:11:04

标签: c# datacontractserializer xml-deserialization

我目前正在使用XmlSerializer,令人惊讶的是,:)处理我的数据结构的序列化 - 我发现它非常简单易用,但代价是灵活性。目前,我正在使用它作为基于树的结构;由于XmlSerializer不处理循环结构,我已将[XmlIgnore]添加到我的Parent属性,并对树进行反序列化后迭代以修复节点父节点。

使用XmlSerializer是否有更好的方法来处理此问题,或者使用XmlReader/XmlWriter重写代码会更好吗?我认为实施IXmlSerializable会起作用,但这似乎是相当多的工作,同时仍保留XmlSerializer的缺点。

当前的反序列化步骤没有问题,但是我正在添加一个必须序列化为单独的XML文件的数据结构:基本上是一个需要Parent属性引用上一个树结构中的节点的项目的平面列表。这将需要一个后反序列化步骤,以及在新数据结构中同时保持Parent属性以及ParentId(或一些技巧)。

那么,任何聪明(和非脆弱)的想法?或者XmlReader/XmlWriter是吗?

解决方案

DataContractSerializer原来是一个相当不错的解决方案,与XmlSerializer几乎一样简单。我选择不使用自动循环处理,而是定义和OnDeserialized装饰方法来处理设置父节点;这样,生成的XML符合标准。

让我困惑一段时间的一件事是我在反序列化后在某些属性上崩溃,后备成员设置为null - 无法弄清楚这是如何可能的,因为支持成员肯定在所有可能的构造函数中初始化。调试显示构造函数从未被调用过,经过一些谷歌搜索,我发现this SO post有一个解释。

2 个答案:

答案 0 :(得分:1)

您可以尝试二进制序列化(BinarySerializer或DataContractSerializer),我认为这样可以更好地处理循环图,代价是没有人类可读的数据表示。或者,您可以按详细here尝试SoapFormatter。

答案 1 :(得分:1)

使用DataContractSerializer。使用[DataContract(IsReference = true)]标记您的课程。