2009-05-18 48 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由一組彼此對象引用組成。如果你有一個沒有向後鏈接的對象樹,序列化和反序列化是很簡單的。使用通用圖,(反)序列化過程需要跟蹤每個對象的身份,並使用某種形式的標記和掃描算法來確保對象不被(連續)兩次序列化。

相關問題