2009-04-21 107 views
2

对象序列化如何工作?如何将对象反序列化并从序列化日期创建实例而不调用任何构造函数?对象序列化

+0

http://forum.codecall.net/csharp-tutorials/7918-tutorial-visual-studio-2008-c-serialization.html – 2009-04-21 19:30:14

+0

让我知道如果这不是你的答案.. – 2009-04-21 19:32:06

回答

6

我已经保持这个答案语言不可知,因为没有给出一种语言。

当对象被序列化时,所有需要的信息重新编译都可以被检索到。这通常包括对象的类型以及所有实例变量的值。

当对象被反序列化时,分配正确大小的内存区域并使用序列化信息填充,以便新对象与序列化信息相同。

正在运行的程序可以在内存中引用这个新对象,而无需实际调用构造函数。

这里有很多小细节没有解释,但这是序列化/反序列化的总体思路。

0

您是否在谈论Java?如果是这样,序列化是一种超常的对象创建机制。这是一个使用本地代码创建对象而不调用任何构造函数的后门。因此,在设计可序列化类时,需要确保通过反序列化创建的类与通过构造函数路径保持相同的不变量(要被初始化的键字段)。在Java中创建对象的第三种方法是克隆,并应用类似的问题。

如果您需要将该字段的值设置为与克隆或反序列化过程返回的值不同,克隆和序列化不会与最终字段的使用互动。

Josh Bloch的“Effective Java”有一些章节更深入地解释了这些问题。

(这个答案可以适用于其他语言也一样,但我只在Java中使用序列化)

0

关于.NET:这不是一个明确的或教科书的答案,我可能会全力以赴的错...

.NET序列化需要分解成二进制与其他(XML或XML衍生通常)。二进制序列化对我来说大多是一个黑盒子,但它允许对象在当前状态下序列化和恢复。 XML序列化通常仅序列化对象的公共字段/属性,除非通过添加自定义ISerializable实现来重写。

在XML序列化的情况下,我相信.NET使用反射来确定哪些字段和属性转换为它们的等效元素。添加[XMLSerializable]属性将实现一个默认行为,可以通过在字段级别应用其他属性(如[XMLAttribute])来进行调整。

元数据(Reflection依赖于)存储所有对象成员以及它们的属性和地址,这允许序列化程序确定它应该如何构建输出。