如果扩展一个实现Serializable"下线"的类,为什么还需要重新定义serialVersionUID?

fge*_*fge 5 java inheritance serialization

对于我的一个项目,我需要定义一个扩展的新异常ProviderMismatchException.

从javadoc链接中,您可以看到此异常:

  • 延伸IllegalArgumentException,哪个
  • 延伸RuntimeException,哪个
  • 延伸Exception,哪个
  • 延伸Throwable.

所有这些都定义了自己的,static final serialVersionUID除了Throwable添加private修饰符.

现在,如果你实现了一个接口Foo,那么所有继承的classse也会实现该接口,这也代表Serializable着它; 但是,为什么JDK中的子类为每个子类重新定义它?没有为继承的类再次定义它的危险是什么?

小智 4

SerialVersioUID 是一个静态长值,因此它不会通过类层次结构继承。

您需要它来指示类的先前序列化实例是否具有与当前实现相同的版本。

如果可序列化类未显式声明serialVersionUID,则序列化运行时将根据该类的各个方面计算该类的默认serialVersionUID 值,如Java(TM) 对象序列化规范中所述。但是,强烈建议所有可序列化类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类详细信息高度敏感,这些详细信息可能因编译器实现而异,因此可能会在反序列化期间导致意外的InvalidClassExceptions。

详细信息请参见此处:

什么是serialVersionUID?为什么要使用它?