4

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

有没有更好的方法来处理这个问题XmlSerializer,还是用重写代码会更好XmlReader/XmlWriter?我想实施IXmlSerializable会奏效,但这似乎是相当多的工作,同时仍然保留XmlSerializer.

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

那么,有什么聪明(且不脆弱)的想法吗?或者XmlReader/XmlWriter它是?

解决方案

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

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

4

2 回答 2

1

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

于 2010-08-26T18:08:26.503 回答
1

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

于 2010-08-26T18:22:28.170 回答