对象的序列化

时间:2009-04-21 19:22:28

标签: serialization

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

3 个答案:

答案 0 :(得分:6)

由于没有给出语言,我一直保持这种答案语言不可知。

当对象被序列化时,重建它的所有需要​​信息都以可以检索的方式进行编码。这通常包括对象的类型,以及所有实例变量的值。

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

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

有许多小细节没有解释,但这是序列化/反序列化的一般概念。

答案 1 :(得分:0)

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

如果需要将该字段的值设置为与clone或反序列化过程返回的值不同的话,克隆和序列化与最终字段的使用不能很好地交互。

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

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

答案 2 :(得分:0)

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

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

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

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