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

时间:2015-12-12 22:35:04

标签: java inheritance serialization

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

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

  • 扩展IllegalArgumentException
  • 扩展RuntimeException
  • 扩展Exception
  • 扩展Throwable

除了添加static final serialVersionUID修饰符的Throwable之外,所有人都定义了自己的private

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

1 个答案:

答案 0 :(得分:1)

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

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

  

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

详情见这里:

What is a serialVersionUID and why should I use it?