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()方法读取对象。
【序列化版本号】
serialVersionUID: 字面意思上是序列化的版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量
那怎么来生成序列化版本号呢?
方式一:
方式二:
【序列化版本号的作用】
当实现了Serializable的类(没有定义序列化版本号)序列化成功后进行了修改,当对这个类的实例对象进行反序列化时就会报错,因为这个对象的序列化版本号在类修改之后和之前的对应不上了(安全机制)。
解决办法:
在定义这个类时就指定一个序列化版本号,这样编译器就不会自动为其设置版本号。