Serializable序列化与transient关键字?
请解释Java中**序列化(Serializable)**机制,包括serialVersionUID的作用、transient关键字控制字段序列化、自定义序列化(writeObject/readObject)以及静态字段的序列化行为。
回答
Yahuda
Serializable:标记接口,表示类可被序列化。通过ObjectOutputStream写入、ObjectInputStream读取。
serialVersionUID:
- 序列化版本号,用于反序列化时验证类的版本兼容性
- 若不显式声明,JVM根据类结构自动生成(不同编译器可能不同)
- 建议显式声明:
private static final long serialVersionUID = 1L; - 修改类(增加字段)时,若serialVersionUID不变,老数据可反序列化(新字段取默认值)
transient关键字:
- 修饰的字段不参与序列化
- 反序列化时,transient字段取默认值(对象null、基本类型0/false)
- 典型场景:密码、连接、缓存的敏感或可恢复数据
自定义序列化:
private void writeObject(ObjectOutputStream out) throws IOException { }
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { }
静态字段:属于类而非实例,不参与序列化。
替代方案:
- JSON/XML序列化(Jackson、Gson)更灵活、跨语言
- Java原生序列化存在安全问题和性能问题