java序列化版本问题
java序列化版本
反序列化java对象必须提供该对象的class文件,现在问题引出,对于一直更新升级的类,如何能够保证同一个类在更新之后仍然具有兼容性,在反序列化的时候不至于失败
1.显式定义
对于每个序列化类可以提供一个 private static final long serialVersionUID的值,也就是当类升级之后,只要serialVersionUID Field的数值不变就会把他们当做同一个序列化版本,达到兼容的目的。
两种方法获得;
-
自己定义,但是要保证没有不同类但是序列化版本号相同的情况
-
使用Jdk安装路径下的bin目录的serial.exe工具来获得该类的serialVersionUID的值
用法: serialver [-classpath 类路径] [-show] [类名称...]
2.隐式定义
由jvm计算得到,但是同一个类在不同环境下计算得到的序列化版本号不同可能导致反序列化失败
3.对类的操作是否会引发反序列化失败的讨论
- 1.修改类时仅仅修改了方法,则反序列化不会受到影响,类的定义不需要修改serialVersionUID的数值
- 2.修改类仅仅修改了静态的Field和瞬态的Field(transient关键字修饰的),反序列化不受影响
- 3.如果修改了非静态和非瞬态的Field,则可能导致反序列化失败** 如果对象流中的对象和新类中包含同名的Field,但是类型不同,导致反序列化失败** 如果对象流中的对象比新类中包含更多的field,不会失败,多出的field会失效** 如果新类比对象流中包含更多的field,反序列化得到多出的field为0或者null