1
  1. 为什么必须将serialVersionUID声明为 static、final 和 long 类型的变量?
  2. 这个 serialVersionUID 是唯一的吗?
  3. 当两个或多个类包含相同的 serialVersionUID 时会发生什么?在这种情况下,这个 versionUID 将如何用于反序列化字节数组?
4

2 回答 2

1

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

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

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

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

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

于 2016-07-06T18:55:04.553 回答
1
  1. 为什么必须将 serialVersionUID 声明为 static、final 和 long 类型?

因为规范是这么说的。

  1. serialVersionUID 是否需要唯一?

不,它只区分你的类的不同版本(例如在不同的时间点编译)。如果您正在编写一个新课程,则可以 serialVersionUID = 1L;毫无问题地进行设置。

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

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

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

于 2016-07-06T18:55:37.253 回答