Serializable vs Externalizable

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。

你可能感兴趣的:(java,虚拟机,String,null)