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