我最近一直在阅读关于序列化。我读过,当我使用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. AppFabric缓存 - 对象的序列化和反序列化要求是什么?
- 4. C++如何序列化/反序列化一个对象?
- 5. 为什么如果我不实现序列化我仍然可以序列化一个对象?
- 6. 为什么JSON序列化返回一个部分反序列化的对象?
- 7. 我如何序列化一个空的jsonapi对象
- 8. 我应该如何序列化一个Moose对象数组?
- 9. 我们如何拥有一个可序列化的对象?
- 10. 如何反序列化对象图
- 11. 为什么序列化对象需要序列化
- 12. 如何找出为什么一个对象不能被JSON序列化?
- 13. 我序列化了一个C++对象,如何为它分配内存而不知道它是什么类型?
- 14. 对象序列化如何
- 15. 为什么我不能序列化一个结构体中的对象?
- 16. 如何使用cbor2序列化和反序列化对象?
- 17. 序列化对象图的一部分
- 18. 使用BinaryFormatter序列化和反序列化对象图
- 19. 如果实现对象不是Serializable,那么如何序列化基础对象?
- 20. 我该如何让Jackson反序列化一个Long到一个Date对象?
- 21. Java和对象序列化
- 22. 如何用“一对多”关系序列化两个对象?
- 23. 为什么jQuery ajax不能序列化我的对象?
- 24. 为什么我的.NET对象序列化?
- 25. 为什么我们不能序列化这些对象?
- 26. Unity对象引用+序列化字段。我错过了什么?
- 27. 为什么我的对象没有正确的反序列化?
- 28. 为什么我无法使用DataContractSerializer序列化对象?
- 29. 什么是编程中的“序列化”对象?
- 30. Java:什么是读取序列化对象的最佳方法?