为啥java中的serialVersionUID必须是静态的、最终的和long类型的? [复制]

Posted

技术标签:

【中文标题】为啥java中的serialVersionUID必须是静态的、最终的和long类型的? [复制]【英文标题】:Why serialVersionUID in java must be static, final, and of type long? [duplicate]为什么java中的serialVersionUID必须是静态的、最终的和long类型的? [复制] 【发布时间】:2016-11-08 22:53:18 【问题描述】:
    为什么serialVersionUID 必须声明为静态、最终和长变量类型? 这个serialVersionUID 是唯一的吗? 当两个或多个类包含相同的 serialVersionUID 时会发生什么?在这种情况下,这个 versionUID 将如何用于反序列化字节数组?

【问题讨论】:

你有 3 个问题合二为一。请专注于一个。如果是第一个,您在寻找什么样的答案?它必须是 static final 并且类型为 long because the spec says so。 【参考方案1】:

它是静态的,因为它属于类,而不是实例。

它是最终的,因为它不会改变(对于那个版本的类)。仅当有人对影响其序列化方式的类进行更改时,它才会更改。

之所以长,是因为该数据类型易于序列化,适合紧凑的空间,并且具有比任何人都可能需要的更多的值。

它不必是唯一的。如果一个类的两个版本具有相同的 serialversionUID,这意味着该类没有影响其序列化方式的更改,则该类的这两个版本可以接受相同的序列化格式。

两个类是否有相同的serialVersionUID无关紧要,类之间不使用,仅用于检查类的序列化版本是否与该版本的类兼容。

【讨论】:

为什么long更容易序列化?为什么不应该是这样的 int 或 short ?你能帮我知道这个吗.. @user1391703:这进入了“因为规范这么说”的领域。另请参阅 Eric Lippert 对meta.***.com/questions/323334/…的出色回复 什么是数字?只是用谷歌搜索了解相同但不知道..请解释一下.. @Rabbit '可能是 他们认为 数字将在双字边界上对齐',尽管这不是真的在序列化中,这一切都无关紧要。【参考方案2】:
    为什么必须将 serialVersionUID 声明为 static、final 和 long 类型?

因为the specification是这么说的。

    serialVersionUID 是否需要唯一?

没有。它仅区分 您的类 的不同版本(例如,在不同时间点编译)。如果你正在编写一个新类,你可以设置 serialVersionUID = 1L; 没有任何问题。

    当两个或多个类包含相同的 serialVersionUID 时会发生什么?在这种情况下,serialVersionUID 如何用于反序列化字节数组?

两个或多个类可以声明相同的serialVersionUID。实际的线格式包含完全限定的类名,因此没有歧义。

如果正在加载的数据中的serialVersionUID与您的类的serialVersionUID不匹配,则会抛出InvalidClassException

【讨论】:

以上是关于为啥java中的serialVersionUID必须是静态的、最终的和long类型的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们在扩展 RuntimeException 时需要 serialVersionUID?

Java中的serialVersionUID

为啥存在 serialVersionUID 字段?

java中的serialVersionUID是啥,通常在异常类中? [复制]

跨不同 JVM 的 Java 标准库中的 SerialVersionUID

Java序列化中的SerialVersionUid