我目前正在使用XmlSerializer
,令人惊讶的是,:)处理我的数据结构的序列化 - 我发现它非常简单易用,但代价是灵活性。目前,我正在使用它作为基于树的结构;由于XmlSerializer
不处理循环结构,我已将[XmlIgnore]
添加到我的Parent
属性,并对树进行反序列化后迭代以修复节点父节点。
使用XmlSerializer
是否有更好的方法来处理此问题,或者使用XmlReader/XmlWriter
重写代码会更好吗?我认为实施IXmlSerializable
会起作用,但这似乎是相当多的工作,同时仍保留XmlSerializer
的缺点。
当前的反序列化步骤没有问题,但是我正在添加一个必须序列化为单独的XML文件的数据结构:基本上是一个需要Parent属性引用上一个树结构中的节点的项目的平面列表。这将需要一个后反序列化步骤,以及在新数据结构中同时保持Parent属性以及ParentId(或一些技巧)。
那么,任何聪明(和非脆弱)的想法?或者XmlReader/XmlWriter
是吗?
DataContractSerializer
原来是一个相当不错的解决方案,与XmlSerializer几乎一样简单。我选择不使用自动循环处理,而是定义和OnDeserialized装饰方法来处理设置父节点;这样,生成的XML符合标准。
让我困惑一段时间的一件事是我在反序列化后在某些属性上崩溃,后备成员设置为null - 无法弄清楚这是如何可能的,因为支持成员肯定在所有可能的构造函数中初始化。调试显示构造函数从未被调用过,经过一些谷歌搜索,我发现this SO post有一个解释。
答案 0 :(得分:1)
您可以尝试二进制序列化(BinarySerializer或DataContractSerializer),我认为这样可以更好地处理循环图,代价是没有人类可读的数据表示。或者,您可以按详细here尝试SoapFormatter。
答案 1 :(得分:1)
使用DataContractSerializer
。使用[DataContract(IsReference = true)]
标记您的课程。