可能重复:
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.
为什么呢?如何解决?
答案 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的问题取决于应用程序的规模和对象序列化的预期用途。