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。
序列化的应用场景
- 对象序列化后,通过网络传输
- 序列化的对象,通过流存储到文件