当缺少serialVersionUID时,Eclipse会发出警告。
可序列化类Foo未声明静态finallong类型的serialVersionUID字段
什么是serialVersionUID,为什么它很重要?请显示缺少serialVersionUID将导致问题的示例。
当缺少serialVersionUID时,Eclipse会发出警告。
可序列化类Foo未声明静态finallong类型的serialVersionUID字段
什么是serialVersionUID,为什么它很重要?请显示缺少serialVersionUID将导致问题的示例。
当前回答
首先回答您的问题,当我们不在类中声明SerialVersionUID时,Java运行时会为我们生成它,但该过程对许多类元数据敏感,包括字段数、字段类型、字段的访问修饰符、类实现的接口等。因此,建议我们自己声明它,Eclipse也会警告您。
序列化:我们经常处理状态(对象变量中的数据)非常重要的重要对象,因此在将对象状态发送到其他机器时,我们不会因电源/系统故障(或网络故障)而丢失它。这个问题的解决方案被命名为“持久性”,这意味着持久化(保存/保存)数据。串行化是实现持久性的许多其他方法之一(通过将数据保存到磁盘/内存)。保存对象的状态时,为对象创建标识,以便能够正确地将其读回(反序列化),这一点非常重要。此唯一标识ID为SerialVersionUID。
其他回答
您可以告诉Eclipse忽略这些serialVersionUID警告:
窗口>首选项>Java>编译器>错误/警告>潜在编程问题
如果您不知道,您可以在本节中启用许多其他警告(甚至将一些警告报告为错误),其中许多警告非常有用:
潜在的编程问题:可能的意外布尔赋值潜在编程问题:空指针访问不必要的代码:从不读取局部变量不必要的代码:冗余空检查不必要的代码:不必要的强制转换或“instanceof”
以及更多。
字段数据表示类中存储的一些信息。类实现Serializable接口,因此eclipse自动提供声明serialVersionUID字段。让我们从这里设置的值1开始。
如果您不希望出现警告,请使用以下选项:
@SuppressWarnings("serial")
不用担心,默认计算非常好,可以满足999999%的情况。如果你遇到问题,你可以——正如已经说过的——在需要时引入UID(这是极不可能的)
这个问题在Joshua Bloch的《有效Java》中有很好的记录。一本非常好的书,是一本必读的书。我将概述以下原因:
序列化运行时为每个可序列化类提供一个名为Serialversion的数字。此编号称为serialVersionUID。现在这个数字背后有一些数学,它是基于类中定义的字段/方法得出的。对于同一类,每次都会生成相同的版本。在反序列化过程中使用此数字来验证序列化对象的发送方和接收方是否已为该对象加载了与序列化兼容的类。如果接收方为对象加载的类具有与对应发送方类不同的serialVersionUID,则反序列化将导致InvalidClassException。
如果类是可序列化的,则还可以通过声明名为“serialVersionUID”的字段来显式声明自己的serialVersionUID,该字段必须是静态的、final的和long类型的。大多数IDE(如Eclipse)都可以帮助您生成长字符串。
如果您永远不需要将对象序列化到字节数组并发送/存储它们,那么您就不必担心。如果需要,那么您必须考虑serialVersionUID,因为对象的反序列化程序会将其与其类加载器所具有的对象版本相匹配。在Java语言规范中了解更多有关它的信息。