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

xiabibo 发布于 2011/10/12 09:03
阅读 5K+
收藏 0

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

以下是问题补充:

@xiabibo:类被修改后,没有修改serialVersionUID的值,出错? 不同的虚拟机,serialVersionUID的值不同,出错? 能说说通俗点(好理解点)的原因吗? (2011/10/12 11:20)
加载中
0
磊神Ray
磊神Ray

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

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

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

0
鉴客
鉴客

在序列化的时候会有问题。建议把这个属性干掉!

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

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

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

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

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

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

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

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

0
磊神Ray
磊神Ray

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

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

0
Happy健
Happy健

不会有问题,我们的项目中所有的序列化的类都是1L,这就是个标识符,不用过多的考虑它。

返回顶部
顶部