pko*_*iej 39 .net serialization xml-serialization
我最近一直在阅读有关序列化的内容.我已经读过,当我使用XmlSerialization时,我无法序列化对象图.什么是对象图以及为什么我不能简单地序列化它?
Mar*_*ell 52
对象图不是单个对象,而是一组相关对象.举个简单的例子,考虑一下:
public class Node {
public string Name {...}
public Node Parent {...}
public List<Node> Children {...}
}
Run Code Online (Sandbox Code Playgroud)
每个孩子都知道父母(父母知道孩子).
问题是xml是一个基于对象属性的树......它想要只是走它们 - 即使用简单的父/子:
将序列化为:
<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 ***
Run Code Online (Sandbox Code Playgroud)
你可以看到我们回到了A,所以我们现在处于无限循环中.
XmlSerializer
可以序列化数据树,但不能完整图表.您可以标记要忽略的属性,例如:
[XmlIgnore]
public Node Parent {...}
Run Code Online (Sandbox Code Playgroud)
现在它会起作用,但我们必须在Parent
事后解决问题.
相比之下,其他一些序列化程序可以处理图形(DataContractSerializer
可以按需).它通过针对唯一键跟踪对象来实现此目的 - 但是输出不是您对常规xml的期望.
对象图是一组彼此引用的对象.
序列化对象图很棘手.序列化程序必须为每个对象分配唯一的ID,然后用唯一ID替换引用.
如果它是以XML格式序列化并处理对象图,则必须向每个元素添加"OBJECT_ID"(或其他一些命名的)属性.这很容易破解:如果您为要序列化的类添加了一个具有相同名称的属性,会发生什么?
最简单的解决方案是不支持它.
.NET提供了二进制序列化,它处理了这个问题以及循环引用的问题.