存档

2014年6月 的存档

JAVA序列化中的一些问题

2014年6月3日 没有评论

1.serialVersionUID的作用

  serialVersionUID可以认为是一个类的摘要,默认值的计算依赖于类的构造方法、成员变量和成员方法的定义规则,具体算法代码位于:java.io.ObjectStreamClass.computeDefaultSUID(Class<?>) 。对于implements Serializable的类而言可以显示或非显示的定义serialVersionUID,在通常情况下建议显示定义serialVersionUID,这样就算改变成员方法定义也不会影响到反序列化操作。

2.成员变量的增加或减少会影响反序列化吗?

  这个问题的前提是显示定义了serialVersionUID,如果非显示定义serialVersionUID则对 构造方法、成员变量和成员方法的任意修改都会导致反序列化失败,因为反序列化时会计算当前Class的serialVersionUID,如果序列化前后不一致则会导致反序列化失败。

  在显示定义了serialVersionUID的情况下如果保证serialVersionUID的值序列化前后不变,则对成员变量的增加或减少都不会导致反序列化失败,但如果是对原有成员变量的定义进行了修改,如:public int a;变成了public Srting a; 则会导致反序列化失败,具体代码位于:java.io.ObjectStreamClass.matchFields(ObjectStreamField[], ObjectStreamClass) 方法,这个方法会判断序列化对象和jvm加载对象的属性类型是否一样。

分类: 高级民工 标签: