Java 序列化与反序列化

概念

Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。

序列化的原因

两个进程远程通信时,可以相互发送各种类型的数据,包括文本,图片,音频,视频,这些数据都会以二进制序列的形式在网络上传送.,那么当两个Java进程通信时,如何实现进程间的对象传送呢?答案就是序列化与反序列化. 换句话说,一方面,发送方需要把这个Java对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出Java对象。

序列化的好处

好处一是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上,好处二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。

如何实现

java.io.ObjectOutputStream:表示对象输出流

它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

java.io.ObjectInputStream:表示对象输入流

它的readObject()方法从输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。

只有实现了Serializable或Externalizable接口的类的对象才能被序列化,否则抛出异常。

原理

Java序列化序列化对象的信息包括:类元数据描述、类的属性、父类信息以及属性域的值。Java将这些信息分成3部分:序列化头信息、类的描述部分以及属性域的值部分。

java序列化算法的基本步骤:
a)输出序列化的头部信息,包括标识序列化协议的幻数以及协议的版本;
b)按照由子类到父类的顺序,递归的输出类的描述信息,直到不再有父类为止;类描述信息按照类元数据,类属性信息的顺序写入序列化流中;
c)按照由父类到子类的顺序,递归的输出对象域的实际数据值;而对象的属性信息是按照基本数据类型到java对象类型的顺序写入序列化流中;其中java对象类型的属性会从步骤a)重新开始递归的输出,直到不再存在java对象类型的属性。