简单理解序列化和反序列化java

https://zhuanlan.zhihu.com/p/62190281

今天,来总结一下感觉被遗忘了很久的JavaSE基础中的序列化和反序列化的概念。


序列化:是把对象转换为字节序列,永久存到磁盘中。在网络中传输对象也要进行序列化。

反序列化:是从磁盘中读取字节序列将它们反序列化成对象读出来。

【序列化的使用】

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

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

注:只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。

默认的序列化方式 。

【对象序列化步骤】

1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;

2) 通过对象输出流的writeObject()方法写对象。

【对象反序列化的步骤】

1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;

2) 通过对象输入流的readObject()方法读取对象。

【序列化版本号】

s​e​r​i​a​l​V​e​r​s​i​o​n​U​I​D​:​ ​字​面​意​思​上​是​序​列​化​的​版​本​号​,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量

那怎么来生成序列化版本号呢?

方式一:

方式二:

序列化版本号的作用

当实现了Serializable的类(没有定义序列化版本号)序列化成功后进行了修改,当对这个类的实例对象进行反序列化时就会报错,因为这个对象的序列化版本号在类修改之后和之前的对应不上了(安全机制)。

解决办法:

在定义这个类时就指定一个序列化版本号,这样编译器就不会自动为其设置版本号。

原文地址:https://www.cnblogs.com/sunny3158/p/14341669.html