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中实现这一点。