概况
- 序列化时将 Java 对象相关的类信息、属性及属性值等等保存起来,反序列化时再根据这些信息构建出 Java 对象。
- Java 中进行序列化操作需要实现 Serializable 或 Externalizable 接口。
序列化的作用
- 提供一种简单又可扩展的对象保存恢复机制。
- 对于远程调用,能方便对对象进行编码和解码,就像实现对象直接传输。
- 可以将对象持久化到介质中,就像实现对象直接存储。
- 允许对象自定义外部存储的格式。
serialVersionUID的作用
主要用于验证版本一致性,每个类都拥有这么一个 ID,在序列化的时候会一起被写入流中,那么在反序列化的时候就被拿出来跟当前类的 serialVersionUID 值进行比较,两者相同则说明版本一致,可以序列化成功,而如果不同则序列化失败。
private static final long serialVersionUID = 1234567890L;
父类序列化
如果一个子类实现了 Serializable 接口而父类没有实现该接口,则在序列化子类时,子类的属性状态会被写入而父类的属性状态将不被写入。所以如果想要父类属性状态也一起参与序列化,就要让它也实现 Serializable 接口。
另外,如果父类未实现 Serializable 接口则反序列化生成的对象会再次调用父类的构造函数,以此完成对父类的初始化。所以父类属性初始值一般都是类型的默认值。
Externalizable 接口作用
Externalizable 接口主要提供自定义序列化方式,继承 Serializable 接口,提供了 writeExternal 和 readExternal 两个方法控制序列化和反序列化的内容。
序列化控制
- 默认情况下所有字段都会被序列化
- 静态字段不会被序列化
- transient关键字修饰字段不会被序列化
- 可通过ObjectStreamField数组来声明类需要序列化的字段