为啥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是啥,通常在异常类中? [复制]