序列化字段 serialVersionUID 怎么理解?

java.io.Serializable接口类,相信很多攻城狮都用过,它是对象序列化和反序列化必须实现的接口类。我们需要显示的定义字段serialVersionUID,或者在编译时,编译器自动生成这个字段。

作用

反序列化时版本比较使用。

显式和隐式的区别

private static final long serialVersionUID = 4578891993197200693L;
复制代码

当我们显式在代码中写上serialVersionUID的定义时,序列化和反序列化都会使用这个版本号。

当使用隐式方式生成的这个字段时,编译器会根据类名,成员名生成一个唯一的版本号。
序列化时用的版本号是version_id_1,然后我们添加了一个类的成员,编译生成一个新的版本号version_id_2,在对前一次序列化的结果进行反序列化时,比较版本号不一致,导致反序列化报错。所以,建议需要序列化和反序列化的类,显示定义版本号。

什么字段不能被序列化

  • 静态字段
  • Transient修饰的字段
  • 没有实现Serializable的父类字段

serialVersionUID如何自动生成(idea)

设置中搜索,serializable class without 'serialVersionUID',勾选,保存。
当一个类implements java.io.Serializable时,鼠标放到类名上,会自动提示 Add serialVersionUID field

序列化的应用场景

  • 对象序列化后,通过网络传输
  • 序列化的对象,通过流存储到文件
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享