8
回答
serialVersionUID 全部设为1L 会有什么问题吗?

很多地方都使用默认的:private static final long serialVersionUID = 1L; serialVersionUID都为1L,会不会有什么问题?

举报
xiabibo
发帖于7年前 8回/5K+阅

以下是问题补充:

  • @xiabibo :类被修改后,没有修改serialVersionUID的值,出错? 不同的虚拟机,serialVersionUID的值不同,出错? 能说说通俗点(好理解点)的原因吗? (7年前)
共有8个答案 最后回答: 1年前

实现java.io.Serializable这个接口是为序列化,serialVersionUID 用来表明实现序列化类的不同版本间的兼容性。如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会出错。

这样,即使某个类在与之对应的对象已经序列化出去后做了修改,该对象依然可以被正确反序列化。否则,如果不显式定义该属性,这个属性值将由JVM根据类的相关信息计算,而修改后的类的计算结果与修改前的类的计算结果往往不同,从而造成对象的反序列化因为类版本不兼容而失败。

不显式定义这个属性值的另一个坏处是,不利于程序在不同的JVM之间的移植。因为不同的编译器实现该属性值的计算策略可能不同,从而造成虽然类没有改变,但是因为JVM不同,出现因类版本不兼容而无法正确反序列化的现象出现。

问题大了。。。。。。。建议用随机值,而且每个类随机生成一次后,以后改类了也不要改这个值。这个涉及到序列化的一些问题,如果没有这个值,那更是要不得的。所有类都用同一个值也有问题哈。
一般不会有问题,即使有序列化的情况下一般也不会有问题。所有类用一个值一般也没什么问题的,他是区分同一个类的不同版本,在序列化和反序列化的时候会用到。

引用来自“磊.Y”的答案

实现java.io.Serializable这个接口是为序列化,serialVersionUID 用来表明实现序列化类的不同版本间的兼容性。如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会出错。

这样,即使某个类在与之对应的对象已经序列化出去后做了修改,该对象依然可以被正确反序列化。否则,如果不显式定义该属性,这个属性值将由JVM根据类的相关信息计算,而修改后的类的计算结果与修改前的类的计算结果往往不同,从而造成对象的反序列化因为类版本不兼容而失败。

不显式定义这个属性值的另一个坏处是,不利于程序在不同的JVM之间的移植。因为不同的编译器实现该属性值的计算策略可能不同,从而造成虽然类没有改变,但是因为JVM不同,出现因类版本不兼容而无法正确反序列化的现象出现。

能说说两种情况报错的原因吗(方便理解):

  1. 类被修改后,没有修改serialVersionUID的值,出错?
  2. 不同的虚拟机,serialVersionUID的值不同,出错?

能说说通俗点(好理解点)的原因吗?

没有设置serialVersionUID,因为修改后反序列化得到的类,与修改前不一致,而缺乏序列化,导致失败。

设置serialVersionUID后,它就会将不一样的field以type的预设值Deserialize.这个可以避开不兼容性的问题。

顶部