什么是序列化,如何实现序列化
概述
- Java序列化是指将Java对象转换为二进制字节流,以便于持久化和传输的过程。反之,则称为反序列化
- 默认的序列化实现由JVM负责,可序列化的对象需要实现Serializable接口
- Serializable接口不包含任何方法,只用于标记该对象可序列化;若未实现该接口,则序列化时会报NotSerializableException异常
自定义序列化方式
- 在对象中重写 writeObject 和 readObject 方法
- 实现Externalizable接口
serialVersionUID常数
- 该常数用于指定对象的版本,反序列化时会检查版本是否改变,若改变则会报错
- 建议显示赋值该常量,否则jvm会根据对象属性、方法等自动生成,若序列化前后对象有变化,则版本号会重新生成,反序列化时就会抛异常
Externalizable
- Externalizable 序列化的优先级比Serializable的优先级高
- 使用 Externalizable 进行序列化时,必须要有默认的构造方法,而Serializable可以没有默认的构造方法。 这是因为使用 Externalizable 进行反序列化时,需要有默认的构造方法,通过反射先创建出该类的实例,然后再把解析后的属性值,通过反射赋值
其他注意事项
- 静态变量不会被序列化
- transient 关键字修饰的属性不会被序列化
- Serializable反序列化时不会调用构造方法
参考文献
https://cloud.tencent.com/developer/article/1655892
https://cloud.tencent.com/developer/article/1130025
https://www.baeldung.com/java-serialization
https://www.baeldung.com/java-externalizable