目录

一.什么是序列化

二.什么时候需要序列化

三.利用 ObjectOutputStream类实现序列化(对象转为字节)

(1)构造方法

四.序列化操作

1.一个对象要想序列化,必须满足两个条件:

五.利用ObjectInputStream类实现反序列化

1.构造方法

2.反序列化操作1

3.反序列化操作2


一.什么是序列化

序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。

反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。对象的数据、对象的类型和对象中存储的数据信息,都可以用来在内存中创建对象
 

二.什么时候需要序列化

1.想把的内存中的对象状态保存到一个文件中或者数据库中时候;
2.想用套接字网络上传送对象的时候;
3.想通过RMI传输对象的时候

三.利用 ObjectOutputStream类实现序列化(对象转为字节)

(1)构造方法

public ObjectOutputStream(OutputStream out): 创建一个指定OutputStream的ObjectOutputStream。

FileOutputStream fileOut = new FileOutputStream("aa.txt");
ObjectOutputStream out = new ObjectOutputStream(fileOut);

四.序列化操作

1.一个对象要想序列化,必须满足两个条件:


(1)该类必须实现java.io.Serializable 接口,Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException 。

(2)该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。
 

五.利用ObjectInputStream类实现反序列化

ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象

1.构造方法


public ObjectInputStream(InputStream in): 创建一个指定InputStream的ObjectInputStream。

2.反序列化操作1


如果能找到一个对象的class文件,我们可以进行反序列化操作,调用ObjectInputStream读取对象的方法:public final Object readObject () : 读取一个对象。
对于JVM可以反序列化对象,它必须是能够找到class文件的类。如果找不到该类的class文件,则抛出一个 ClassNotFoundException 异常。

3.反序列化操作2

另外,当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个InvalidClassException异常。发生这个异常的原因如下:

1、该类的序列版本号与从流中读取的类描述符的版本号不匹配
2、该类包含未知数据类型
2、该类没有可访问的无参数构造方法

Serializable 接口给需要序列化的类,提供了一个序列版本号。serialVersionUID 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。