序列化与反序列化

1 概述

序列化是指将对象的状态信息转换为可以存储或传输形式的过程,在序列化期间,对象将其当前状态写入到临时或持久性存储区,以后可以通过从存储区中读取或者反序列化对象的状态,重新创建对象。

序列化:利用ObjectOutputStream,把对象的信息,按照固定的构式转成一串字节值输出并持久保存到磁盘

反序列化:利用ObjectInputStream,读取磁盘中之前序列化好的数据,重新恢复成对象

序列化与反序列化

2 特点/应用场景

1.需要序列化的文件必须实现Serializable接口,用来启用序列化功能

2.不需要序列化的数据可以修饰成static,原因:static资源属于类资源,不随着对象被序列化输出

3.每一个被序列化的文件都有一个唯一的id,如果没有添加此id,编译器会自动根据类的定义信息计算产生一个

4.在反序列化时,如果和序列化的版本号不一致,无法完成反序列化

5.常用与服务器之间的数据传输,序列化成文件,反序列读取数据

6.常使用套接字流在主机之间传递对象

 7.不需要序列化的数据也可以被修饰成transient(临时的),只在程序运行期间在内存中存在,不会被序列化持久保持  

3 涉及到的流对象

序列化:ObjectOutputStream

ObjectOutputStream将 Java对象的基本数据类型写入OutputStream,通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。序列化与反序列化

反序列化:ObjectInputStream

ObjectInputStream对以前使用ObjectputStream写入的基本数据和对象进行反序列化重构对象 序列化与反序列化

4 为什么反序列化版本号需要与序列化版本号一致

我们在反序列化时,JVM会拿着反序列化流中的serialVersionUID与序列化时相应的实体类中的serialVersionUID来比较,如果不一致,就无法正常反序列化,出现序列化版本不一致的异常InvalidClassException。

而且我们在定义需要序列化的实体类时,如果没有手动添加UID,

Java序列化机制会根据编译的class自动生成一个,那么只有同一次编译生成的class才是一个的UID。

如果我们手动添加了UID,只要这个值不修改,就可以不论编译次数,进行序列化和反序列化操作。 

上一篇:Java IO---3---IO 序列化 ObjectOutputStream类 与 ObjectInputStream类


下一篇:序列化流和反序列化流