2011-04-12 86 views

回答

28

这个解释相当不错here

的serialVersionUID的是Serializable类的通用版本标识符。反序列化使用此数字来确保加载的类完全对应于序列化对象。如果未找到匹配项,则引发InvalidClassException。

您可以通过添加

private static final long serialVersionUID = 7526472295622776147L; // unique id 

到类修复错误。

延伸阅读:


一个侧面说明:如果你正在使用Eclipse,如果你(和无一个人)曾经计划序列化你的类,你也可以抑制错误或将

         窗口→首选项→Java的编译器→→错误/警告

,并选择 “忽略”, “序列化类的serialVersionUID无”。

+3

你如何产生7526472295622776147L? – user496949 2011-04-12 08:01:57

+4

您只需选择一个随机(唯一)长整型值。在Eclipse中,你可以做*资料来源清理...-> Custome简介 - >缺少代码 - >添加序列版本ID * – aioobe 2011-04-12 08:02:43

+0

感谢aioobe,最后一点是我需要知道的。 – 2011-12-27 19:47:39

8

只需添加

private static final long serialVersionUID = 1L;//or some long 

Docs每个序列化类形容它很好

的序列化运行联营 版本 号,称为的serialVersionUID, 这是反序列化 期间用于验证序列化对象的发件人和收件人 已加载 类对于 与 序列化兼容的那个对象。如果接收方为 加载了一个对象的类,该对象的 与对应的发件人类的 不同的serialVersionUID,然后反序列化将导致InvalidClassException的 。可序列化 类可以通过 声明名为 “的serialVersionUID”字段必须显式声明自己的 的serialVersionUID 静态的,最终,和long类型:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; 

如果 序列化类没有明确 声明serialVersionUID,则 串行化运行时将计算 默认serialVersionUID值 该类基于 该类的各个方面,如 Java(TM)Obj ect序列号 规范。然而,强烈 建议所有可序列化 类中明确声明 的serialVersionUID值,因为 默认的serialVersionUID计算 是类细节 高度敏感,可能取决于编译器 实现而不同,因此可能会导致意外InvalidClassExceptions 在反序列化过程中。因此,要保证 保证一致 serialVersionUID值跨越 不同的java编译器 的实现,可序列化类 必须声明明确的 serialVersionUID值。这也是 强烈建议明确 的serialVersionUID声明使用 private修饰符在可能的情况,因为 这些声明仅适用于 立即宣布 类 - serialVersionUID的域不 可用作继承的成员。

请参见

+0

为什么downvote?能否请您解释.. – 2011-04-12 08:02:55

+0

我没有downvote,但也许是因为它是由[乔恩长柄水杓答案](来源一个冗长的副本http://stackoverflow.com/questions/285793/why-should-i-bother - 约-的serialVersionUID/285809#285809)。 – aioobe 2011-04-12 08:07:20

+0

http://download.oracle。com/javase/1.5.0/docs/api/java/io/Serializable.html – 2011-04-12 08:35:54

1

声明它这样:

通过Serializable接口需要
private static final long serialVersionUID = -4673040337179571462L; 

它。

+0

如何生成-4673040337179571462L – user496949 2011-04-12 08:02:16

0

你延伸的摇摆对象?

我经常使用@SuppressWarnings注释来消除这个警告自己。

我猜surpressing警告或提供一个唯一的ID的问题取决于你的应用程序,您打算如何使用对象序列化的规模。

相关问题