一、概念
序列化:把对象转换为字节序列的过程称为对象的序列化
反序列化:把字节序列恢复为对象的过程称为对象的反序列化
二、用途
对象的序列化主要有两种用途:
1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2)在网络上传送对象的字节序列
在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,于是web容器就会把一些session先序列化到硬盘中,等到要用了,再把保存在硬盘中的对象还原到内存中。
当两个进程在进行远程通信时,彼此可以发送各种类型的数据,无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象
三、一些接口和类
序列化和反序列化的一些接口和类:
Java.io.Serializable
Java.io.Externalizable
ObjectOutput
ObjectInput
ObjectOutputStream
ObjectInputStream
Serializable接口:类通过实现java.io.Serializable接口以启用其序列化功能,未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的,序列化接口没有方法或字段,仅用于标识可序列化的语义。
四、父子类实现序列化和反序列化问题
一个子类实现了Serizlizable接口,它的父类都没有实现Seralizable接口,序列化该子类对象,要想反序列化后输出父类定义的某变量的数值,就需要让父类也实现Serializable接口或者父类有默认的无参构造函数中没有多变量赋值,那么父类成员变量值都是默认值。
在父类没有实现Serializable接口时,虚拟机是不会序列化父对象的,而一个Java对象的构造必须先有父对象,才有子对象,反序列化也不列外。所以反序列化时,为了构造父对象,只能调用父类的无参构造函数作为默认的父对象。因此当我们取父对象的变量值时,它的值是调用父类无参构造函数后的值,如果在父类无参构造函数中没有对变量赋值,那么父类成员变量值都是默认值。
根据以上特性,我们可以将不需要被序列化的字段抽取出来放到父类中,子类实现Serializable接口,子类可以序列化,父类不实现Serializable接口,但要提供一个空构造方法,否则父类的字段数据将不被序列化。



