Java 了解有关serialVersionUID字段的FindBugs警告

Java 了解有关serialVersionUID字段的FindBugs警告,java,serialization,Java,Serialization,我有以下类签名和ClientEventSourc实现Serializable: public class Grid extends ClientEventSource implements Focusable, FramingBlockWrapper,LIMSEditableField 现在将此列为不可靠: 类是可序列化的,但未定义SerialVersionId 此类实现可序列化接口,但不定义 SerialVersionId字段。一个简单的更改,如添加对的引用 class对象将向类添加合成字段

我有以下类签名和
ClientEventSourc
实现
Serializable

public class Grid extends ClientEventSource implements Focusable, FramingBlockWrapper,LIMSEditableField
现在将此列为不可靠:

类是可序列化的,但未定义SerialVersionId

此类实现可序列化接口,但不定义 SerialVersionId字段。一个简单的更改,如添加对的引用 class对象将向类添加合成字段,这将 不幸的是,更改隐式serialVersionUID(例如,添加 对String.class的引用将生成一个静态字段 类$java$lang$String)。另外,源代码与字节码不同 编译器可能会对合成变量使用不同的命名约定 为类对象或内部类的引用生成。确保 可串行化跨版本的互操作性,请考虑添加 显式SerialVersionId


有人能解释一下它的意思吗?解决这个问题的最佳方法是什么?

serialVersionUID用于反序列化类。 默认情况下,它是自动生成的。
但是更改类中的任何内容都会生成不同的serialVersionUID,并且无法反序列化“旧”对象。
因此,您可以定义自己的serialVersionUID来帮助反序列化找到正确的类

在代码中添加如下变量:

private static final long serialVersionUID = 6106269076155338045L;
有关生成UID的参考信息:

有人能解释一下这是什么意思吗

对类的微小更改会更改您不想要的
serialVersionUID
,因为这可能会毫无理由地阻止反序列化

解决这个问题的最佳方法是什么

按照它的建议设置它

private static final long serialVersionUID = 1;

是否有生成此数字的算法/程序

对。这是您试图绕过而不是重新创建的算法。只需从
1
开始

我的意思是,它可以是任何东西,或者它需要遵循某些最佳实践


我建议使用
1
是最佳实践,因为它清楚地表明这是一个任意选择的覆盖值。使用像
610626076155338045L
这样的大值可能看起来像生成的数字,或者选择此数字是出于某种原因。

此值用于反序列化。其目的是维护类与其对应的序列化对象之间的兼容性。如果序列化类型为
A
的对象,然后以某种方式更改
A
,则此机制会阻止您反序列化该对象;对象及其类不匹配,您将得到运行时错误

JDK中有一个
serialver.exe
。如果您给它一个
.class
文件作为参数,它将输出一个
serialVersionUID
。大多数IDE都内置了此功能

输入示例:

> serialver MyClass
(已经存在一个文件
MyClass。class
MyClass
必须实现
Serializable

输出示例:

> MyClass: static final long serialVersionUID = -8174364448753809256L;
如果您不喜欢在命令行中执行操作,请执行以下程序:

> serialver -show
将显示此GUI:

然后可以键入类的名称并单击“显示”


如果您感兴趣,我建议您阅读序列化过程。您将确切了解为什么需要此版本ID,在生成此ID时考虑哪些字段/方法以及更多内容。

是否有生成此编号的算法/程序?我的意思是它可以是任何东西,或者它需要遵循某些最佳实践,就像hashcode()在《有效java手册》中描述的那样,并在apache commons的EqualBuilder和HashCodeBuilder中实现。这个数字可以是任何东西,只要它在序列化类中是唯一的。EclipseF.e.有自己的生成器,但您可以使用任何数字。这是一个好的选择吗?你能回答我对科斯特诺回答的评论吗?价值的选择并不重要。你应该在任何时候做出突破性的改变。i、 e.当您进行更改时,您不希望其他版本反序列化为此版本。以我的经验,这几乎是不可能的你知道如何在Intellij Idea中做到这一点吗?@Geek不,对不起。我只用了几个小时的IDE。。。我知道如何在Eclipse和Netbeans中实现这一点。