“声明静态最终serialVersionUID”警告是什么意思以及如何修复?

时间:2011-04-12 07:54:42

标签: java

  

可能重复:
  What does it mean: The serializable class does not declare a static final serialVersionUID field?

Java编译器警告:The serializable class [*****] does not declare a static final serialVersionUID field of type long.

为什么呢?如何解决?

4 个答案:

答案 0 :(得分:30)

这个问题解释得很清楚here

  

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

您可以通过添加

来修复错误
private static final long serialVersionUID = 7526472295622776147L;  // unique id

上课。

进一步阅读:


附注:如果您正在使用Eclipse,并且如果您(并且没有其他人)计划序列化您的类,您也可以通过转到

来抑制错误

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

并在“Serializable Class without serialVersionUID”上选择“忽略”。

答案 1 :(得分:7)

只需添加

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

Docs很好地描述了

  

序列化运行时关联   每个可序列化的类都有一个版本   number,称为serialVersionUID,   在反序列化期间使用   验证发件人和收件人   已加载序列化对象   该对象的类   兼容   序列化。如果接收者有   为具有的对象加载了一个类   与此不同的serialVersionUID   相应发件人的班级,   然后反序列化将导致   InvalidClassException。可序列化的   class可以声明自己的   serialVersionUID显式地由   声明一个名为的字段   必须是“serialVersionUID”   static,final和long类型:

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

如果是   serializable类没有显式   声明一个serialVersionUID,然后是   序列化运行时将计算出一个   默认的serialVersionUID值   该课程基于各方面   该课程,如中所述   Java(TM)对象序列化   规格。然而,它是强烈的   建议所有可序列化   类明确声明   serialVersionUID值,因为   默认的serialVersionUID计算   对课程细节非常敏感   这可能因编译器而异   实现,因此可以得到   在意外的InvalidClassExceptions中   在反序列化期间。因此,到   保证一致   serialVersionUID值   不同的java编译器   实现,可序列化的类   必须声明一个明确的   serialVersionUID值。也是   强烈建议明确   serialVersionUID声明使用   私有修饰符,如果可能的话,因为   此类声明仅适用于   立刻宣布   class - serialVersionUID字段不是   作为继承成员有用。

另见

答案 2 :(得分:1)

声明如下:

private static final long serialVersionUID = -4673040337179571462L;

它是可序列化接口所必需的。

答案 3 :(得分:0)

您是否正在扩展Swing对象?

我经常使用@suppressWarnings注释来摆脱这种警告。

我想压制警告或提供唯一ID的问题取决于应用程序的规模和对象序列化的预期用途。