序列化的都是对象 即被static静态修饰的成员变量不能被序列化(会被忽略),因为静态优先于对象进入到内存中。
被瞬态关键字transient修饰的也不可以被序列化,但是没static那么强,故不想某成员被序列化时用transient修饰
序列化
- 把对象以流的方式写入到文件中保存,即写对象。又叫对象的序列化
- 因为对象包含的可以不只是字符,因此要使用字节流
- 对象的序列化流:
ObjectOutputStream
调用其包含的方法:WriteObject(object o)
反序列化
- 把文件中保存的对象,以流的方式读取出来,叫做读对象,又叫对象的反序列化
- 因为文件保存的都是字节,要使用字节流
- 对象的反序列化流:
ObjectInputStream
,调用其包含的方法:Object readObject()
序列化的使用
- 要进行序列化和反序列化的类,必须实现
Serializabie
接口,即给该类一个标记(因为该接口没有任何方法)
相关类实现
serializable
接口时,会根据类定义给生成的class
文件加一序列号,故每次修改类序列号可能会变,导致反序列化失败(反序列化时会给文件写如原class
内的序列号),抛出序列号冲突异常。故应当给相关类固定序列化,即
static final long serialVersionUID=xxx;
使得序列号为固定常量,切记
- 当我们进行序列化和反序列化的时候,就会检测类是否有该标记
- 有:就可以开始正常的序列化和反序列化操作
- 没有:就会抛出
NotSerializableException
异常
public class Person implements Serializable
- 构造方法:
ObjectOutputStream(OutputStream out)
创建写入指定的out
对象地址 的序列化对象- 使用方法序列化对象,释放资源
close()
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("person.txt")); oos.writeObject(new Person("yang洋",18)); oos.close();
- 使用方法序列化对象,释放资源
反序列化的使用
- 前提:
- 类必须实现
Serializable
接口 - 必须存在对应的
class
文件
- 类必须实现
- 步骤:
- 创建
ObjectInputStream
对象,构造方法传入字节输入流 - 使用方法
readObject
读取文件中的对象 - 关闭资源
- 使用读取的对象
- 创建
- 抛出的异常:`IOException,ClassNotFoundException’
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("person.txt"));
Object o=ois.readObject();
System.out.println(o);
}
对应的结果:
Person{name='yang洋', year=18}
序列化集合
当想在文件中保存多个对象的时候,可以把这多个对象存到一个集合中,然后对集合进行序列化与反序列化 关键还是对象本身