CodeWalk

Serializable序列化与transient关键字?

作者:Yahuda · 2026-05-30 12:55

请解释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原生序列化存在安全问题和性能问题