一、序列化基础
- 序列化 (Serialization)是将对象的状态信息(即对象的成员变量,不会关注类中的静态变量)转换为可以存储或传输的形式的过程。
- 应用于网络传输和远程方法调用(RMI)场景中。
- 序列化也是对象持久化的手段,通过对象序列化,可以把对象的状态保存为字节数组。
- 创建对象,存在于JVM的堆内存中。只有JVM处于运行状态的时候,这些对象才可能存在,一旦JVM停止,这些对象的状态信息就丢失了。
- Transient关键字:控制变量的序列化。声明变量时加上此关键字可以阻止变量序列化到文件中,在反序列化后,修饰的变量的值为初始值。如int类型为0,对象类型为null。
- 实现序列化:类实现
java.io.Serializable
接口,使用ObjectOutputStream
和ObjectInputStream
类的writeObject
和readObject
方法。
二、ArrayList的序列化
- ArrayList使用自定义的序列化和反序列化策略。
- 在ArrayList类中定义两个方法
writeObject
和readObject
实现自定义序列化。 - 自定义的
writeObject
和readObject
方法是通过反射被ObjectOutputStream
中的writeObject
和readObject
方法调用的,从而实现自定义序列化。 - ArrayList自定义序列化原因:优化存储,防止包含大量空对象的数组被序列化,因为ArrayList是动态数组。
Question
- 为什么类要实现
java.io.Serializable
接口才能被序列化,未实现抛出异常?
在ObjectOutputStream
的writeObject
的调用栈中存在对类的类型进行判断,判断类是否是Enum、Array、Serializable类型。 - JVM在什么时候停止运行?