2009-05-18 60 views

回答

50

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

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之后。

相比之下,一些其他序列化器可以处理图形(DataContractSerializer可以按需)。它通过跟踪唯一键上的对象来实现这一点 - 但是输出结果并不是您对常规xml的期望。

9

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

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

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

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

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

5

一般物体graph由一组彼此对象引用组成。如果你有一个没有向后链接的对象树,序列化和反序列化是很简单的。使用通用图,(反)序列化过程需要跟踪每个对象的身份,并使用某种形式的标记和扫描算法来确保对象不被(连续)两次序列化。

相关问题