为什么不自动生成serialVersionUID?

10 java serialization serialversionuid

为什么不serialVersionUID自动生成?我在应用程序服务器上遇到了一个问题,显然是在缓存旧类.

bre*_*ttw 22

serialversionuid不会自动生成,因为它很危险.设置serialversionuid时,意味着类的两个版本在序列化方面是兼容的.

想象一下,你有一个名为Foo的类,它没有serialversionuid(默认值),你将一个Foo实例序列化为一个文件.稍后,您将向Foo类添加一些新成员.如果您尝试从文件反序列化Foo对象,您将收到序列化失败,指出对象不兼容.它们不兼容的,这是你想要的,是默认的.它们是不兼容的,因为Foo类中的新成员无法从旧的Foo序列化实例初始化.

现在,您可能会说,"我不在乎,在我的应用程序中,这些字段未被初始化是可以接受的".如果确实如此,您可以将 Foo类的serialversionuid设置为与 Foo类相同.这将告诉Java这些对象与serializablity兼容,当你将旧的Foo实例反序列化为新的Foo类时,Java不会抱怨(但是新的字段仍然是未初始化的).

如果您是第一次创建新类,并且设置了serialversionuid,则表示您正在输入合同.该合同是"对于具有相同serialversionuid的此类的所有未来版本,我将保证它们在状态和序列化方面兼容".

如果更改了类,并且明确禁止对旧版本进行反序列化,则可以将serialversionuid更改为新值.如果尝试将旧对象反序列化为新的类实例,则会导致抛出异常.

  • 不知道为什么这被标记为正确答案,因为serialVersionUID*是*自动生成的.此外,根据情况,自动生成的ID可能有价值,因为它们在修改类时确保新的数字,而不是有人更改代码然后忘记.但显然不适用于所有情况,正如这篇文章正确指出的那样. (9认同)

Boz*_*zho 9

它是根据类的结构自动生成的.如果结构发生变化,则重新生成id(根据序列化规范,它是hashof类).

所以你最好定义一个明确的serialVersionUID.

  • _所以你最好定义一个显式的serialVersionUID._你是对的,但他们最好知道如何处理关于类的序列化形式的变量,或者这是徒劳的练习. (6认同)