我最近一直在閱讀關於序列化。我讀過,當我使用XmlSerialization我不能序列化對象圖。什麼是對象圖,以及爲什麼我無法簡單地序列化它?什麼是對象圖和我如何序列化一個
37
A
回答
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由一組彼此對象引用組成。如果你有一個沒有向後鏈接的對象樹,序列化和反序列化是很簡單的。使用通用圖,(反)序列化過程需要跟蹤每個對象的身份,並使用某種形式的標記和掃描算法來確保對象不被(連續)兩次序列化。
相關問題
- 1. 序列化一個對象和反序列化爲對象
- 2. 我什麼時候需要序列化一個對象?
- 3. 如何反序列化一個對象?
- 4. 爲什麼我會序列化一個對象而不是做文件輸出?
- 5. AppFabric緩存 - 對象的序列化和反序列化要求是什麼?
- 6. 爲什麼如果我不實現序列化我仍然可以序列化一個對象?
- 7. C++如何序列化/反序列化一個對象?
- 8. 指定如何序列化我的對象,如果它是在一個列表
- 9. 爲什麼JSON序列化返回一個部分反序列化的對象?
- 10. 我應該如何序列化一個Moose對象數組?
- 11. 我們如何擁有一個可序列化的對象?
- 12. 我如何序列化一個空的jsonapi對象
- 13. 如何反序列化對象圖
- 14. 爲什麼序列化對象需要序列化
- 15. 序列化對象會發生什麼?如何保持觀察者序列化?
- 16. 如何找出爲什麼一個對象不能被JSON序列化?
- 17. 我如何序列化/反序列化GTLDriveFile對象到pList
- 18. 我序列化了一個C++對象,如何爲它分配內存而不知道它是什麼類型?
- 19. 對象序列化如何
- 20. 爲什麼我不能序列化一個結構體中的對象?
- 21. 這是什麼類型的對象? XML序列化/反序列化
- 22. 如何序列化和反序列化CipherInputStream對象
- 23. 如何序列化和反序列化hibernate對象?
- 24. 如何使用cbor2序列化和反序列化對象?
- 25. 如何序列化和反序列化靜態引用對象?
- 26. 如何序列化這個JSON對象?
- 27. Java序列化,Kryo和對象圖
- 28. 爲什麼XmlSerializer無法序列化這個列表對象?
- 29. 我該如何找出jQuery如何序列化單個對象?
- 30. 序列化對象圖的一部分