1.ObjectOutputStream类
ObjectOutputStream extends OutputStream
对象的序列化流:把对象以流的方式写入到文件中保存。
构造方法:
ObjectOutputStream(OutputStream out)
//创建写入指定OutputStream的ObjectOutputStream序列化流
写入方法:
void writeObject(Object obj)
//将指定对象写入ObjectOutputStream
2.Serializable接口
标记型接口:要进行序列化和反序列化的类必须实现Serializable接口,就会给类添加一个标记。当我们进行序列化和反序列化的时候,就会检测类上是否有这个标记。有: 就可以序列化和反序列化;没有: 就会抛出NotSerializableException异常。
一个类的序列化是由类实现java.io.serializable接口启用。如果类没有实现这个接口,就无法使其序列化或反序列化。所有类型的序列化类本身是可序列化的。序列化接口没有任何方法或字段只能识别可序列化的语义。
3.ObjectInputStream类
ObjectInputStream extends InputStream
对象的反序列化流:把文件中保存的对象,以流的方式读取出来使用。
构造方法:
ObjectInputStream(InputStream in)
//创建从指定InputStream 读取的 ObjectInputStream
读取方法:
Object readObject()
//从 ObjectInputStream 读取对象
readObject方法声明抛出了ClassNotFoundException(class文件找不到异常),当不存在对象的class文件时抛出此异常。
反序列化的前提:
(1)类必须实现Serializable接口
(2)必须存在类对应的class文件
4.transient关键字
static关键字: 静态关键字。静态优先于非静态加载到内存中(静态优先于对象进入到内存中);被static修饰的成员变量不能被序列化,序列化的都是对象。
transient关键字: 瞬态关键字。被transient修饰的成员变量,不能被序列化。
5.InvalidClassException序列化冲突异常
问题:当修改类的定义时,都会给class文件生成一个新的序列号(serialVersionUID),则可能出现序列化异常冲突。
解决方案:手动给类添加一个序列号。可序列化类可通过声明名为”serialVersionUID"的字段(static final long 型的字段)显式声明其自己的serialVersionUID:static final long serialVersionUID = 42L;
(常量 不能改变)
序列化与反序列化过程: