概述
用一个字节序列可以表示一个对象,字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息(序列化)
该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化
ObjectOutputStream 对象的序列化流
java.io.ObjectOutputStream extends OutputStream 把对象以流的方式写入到文件中保存
构造方法
ObjectOutputStream(OutputStream out)创建写入指定 OutputStream 的 ObjectOutputStream
特有方法
void writeObject(Object obj)将指定的对象写入 ObjectOutputStream。
使用步骤
1、创建ObjectOutputStream对象,构造方法中传递字节输出流
2、使用ObjectOutputStream对象中的方法writeObject,把对象写入到文件中
3、释放资源
一个对象要想序列化,必须满足两个条件:
1、该类必须实现java.io.Serializable 接口,Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException 。
2、该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰,类似static(无法被序列化)。
ObjectInputStream对象的反序列化流
java.io.ObjectInputStream extends InputStream把文件中保存的对象,以流的方法读取出来使用
构造方法
ObjectInputStream(InputStream in)创建从指定 InputStream 读取的 ObjectInputStream。
特有成员方法
Object readObject()从 ObjectInputStream 读取对象。
使用步骤
1、创建ObjectInputStream对象,构造方法中传递字节输入流
2、使用ObjectInputStream对象中的方法readObject,读取保存对象的文件
3、释放资源
4、使用读取出来的对象
反序列化的前提
1、类必须实现Serializable 接口
2、必须存在类对应的class文件
反序列化冲突
序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致InvalidClassException。可序列化类可以通过声明名为"serialVersionUID"的字段(该字段必须是静态 (static)、最终 (final) 的long型字段)显式声明其自己的 serialVersionUID:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;