C#:带有循环链接的节点的 xml 序列化

Posted

技术标签:

【中文标题】C#:带有循环链接的节点的 xml 序列化【英文标题】:C# : xml serialization of nodes with cyclic links 【发布时间】:2011-05-25 20:20:33 【问题描述】:

我有一个类似这样的类节点:

class Node 
    IEnumerable<Node> inputs;

这基本上定义了一个简单的图形。 我想将我的图表序列化为人类可读的形式,所以通常我会说 xml 将是要走的路。 但是 XML 并没有考虑到循环依赖:)

那么 - 对我的图进行序列化的最佳方法是什么?

我能想到几个办法:

抛弃 XML,创建我自己的格式。 使用 XML,用唯一 ID 标记每个节点,将连接列表与节点分开存储并在加载后解析

但我认为其他人以前一定遇到过同样的问题,所以可能有一些更好的选择。 有人知道可靠的方法吗?

【问题讨论】:

【参考方案1】:

对于 xml,我会采用 id 方法(更改 DTO 模型,使其不是循环)。

注意DataContractSerializer 可以通过在重载构造函数中为preserveObjectReferences 选项传入true 来自动支持循环对象图;它不会像XmlSerializer 输出那么简单,但它仍然是可读的。

【讨论】:

【参考方案2】:

如果切换到 WCF DataContractSerializer,则可以保留对象引用(在 3.5 SP 1 及更高版本中)

[DataContract(IsReference=true)]

Sowmy 写得很好here

【讨论】:

以上是关于C#:带有循环链接的节点的 xml 序列化的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Xml 属性序列化带有节点集合的 XML

使用 C# Xml.Serialization 库反序列化每个重复的 XML 节点并将其映射到对象的属性

C# xml序列化时如何去掉节点里的d2p1:type和xmlns:d2p1

C# 在忽略命名空间的同时反序列化 xml

C# Restful WCF 服务。无法在帖子正文中反序列化 XML

C# XML 反序列化为一张表中的 DataSet