什么是对象图,我如何序列化一个对象图
我最近一直在阅读关于序列化。 我读过,当我使用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来确保对象不被(连续)两次序列化。