Serializable vs Externalizable

本文深入探讨了Java中Serializable与Externalizable接口的区别,包括它们如何处理类的字段值、构造函数的调用顺序以及子类与父类之间的序列化流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Serializable: 
首先Serializable是完全序列化,并且记录字段值在构造器中的修改,在反序列化时,先将该类的字段初始化,然后将序列化流 
中所得数据分配给字段。如果一个类实现了Serializable,但他的父类并不是可序列化的,那么该父类必须要有个无参构造函数。 
此情况下,反序列化的顺序是先调用父类无参构造函数。实现Serializable的类中的字段如有对象,那么该对象也需实现Serializable 
关于private void writeObject(ObjectOutputStream o) private void readObject(ObjectInputStream o),前者在序列化对象时调用,后 
者在反序列化对象时调用,在父类无参构造函数调用之后。 
Externalizable: 
实现此接口的类必须实现public void writeExternal(ObjectOutput out)与public void readExternal(ObjectInput in).此类必须有个公有无参构造函数以便在反序列化时调用,并且在反序列化时,是直接将字段恢复成原值(注意)。如果在一个带参构造函数并且在此构造函数中修改了字段值,若想要保存此字段新值,那么就要在Externalzable的接口中明确地写入(因为在反序列化时只会调用到无参构造)。实现Externalzable的类中的字段如有对象,此对象不需实现Externalizable或者Serializable。 

全面性地看了下序列化,得出了这么多结论,真搞不懂Serializable与Externalizable还搞这么多的区别,大家一起看看还有啥遗漏的~



要想将父类对象也序列化,就需要让父类也实现Serializable 接口。如果父类不实现的话的,就 需要有默认的无参的构造函数。 在父类没有实现 Serializable 接口时,虚拟机是不会序列化父对象的,而一个 Java 对象的构造必须先有父对象,才有子对象,反序列化也不例外。所以反序列化时,为了构造父对象,只能调用父类的无参构造函数作为默认的父对象。因此当我们取 父对象的变量值时,它的值是调用父类无参构造函数后的值。如果你考虑到这种序列化的情况,在父类无参构造函数中对变量进行初始化,否则的话,父类变量值都 是默认声明的值,如 int 型的默认是 0,string 型的默认是 null。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值