什么是对象图,我如何序列化一个对象图

我最近一直在阅读关于序列化。 我读过,当我使用XmlSerialization我不能序列化对象图。 什么是对象图,为什么我不能简单地序列化它?

对象图不是一个单一的对象,而是一组相关的对象。 举个简单的例子,考虑一下:

public class Node { public string Name {...} public Node Parent {...} public List<Node> Children {...} } 

每个孩子都知道父母(父母知道孩子)。

问题是,xml是一个基于对象属性的树…它只想走他们 – 即与简单的父/子:

  • A(知道B是它的孩子)
    • B(知道A是它的父母)

这将序列化为:

 <Node> <Name>A</Name> <!-- no Parent as A is the top node, so null --> <Children> <Node> <Name>B</Name> <Parent> <Node> <Name>A</Name> *** boom *** 

你可以看到我们回到了A,所以我们现在处于一个无休止的循环。

XmlSerializer可以序列化数据 ,但不是完整的图。 您可以标记要忽略的属性,例如:

 [XmlIgnore] public Node Parent {...} 

现在它可以工作,但是之后我们必须修复Parent

相比之下,其他一些序列化器可以处理graphics( DataContractSerializer可以按需)。 它通过跟踪唯一键上的对象来实现这一点 – 但是输出结果并不像你期望的那样。

对象图是一组相互引用的对象。

序列化对象图很棘手。 序列化器必须为每个对象分配一个唯一的ID,然后用唯一的IDreplace引用。

如果是以XML格式进行序列化,并处理对象图,则必须为每个元素添加一个“OBJECT_ID”(或其他名称)属性。 这将很容易中断:如果你添加一个属性与你正在序列化的类相同的名称会发生​​什么?

最简单的解决scheme是不支持它。

.NET提供了处理这个问题的二进制序列化以及循环引用的问题。

通用对象图由一组相互保持引用的对象组成。 如果你有一个没有向后链接的对象树,序列化和反序列化是很简单的。 使用通用图,(反)序列化过程需要跟踪每个对象的身份,并使用某种forms的标记 – 扫描algorithm来确保对象不被(连续)两次序列化。