有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如果扩展了一个实现可序列化的类,为什么需要重新定义serialVersionUID?

对于我的一个项目,我需要定义一个扩展^{}的新异常

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

  • 扩展IllegalArgumentException,其中
  • 扩展RuntimeException,其中
  • 扩展Exception,其中
  • 扩展Throwable

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

现在,如果您实现了一个接口Foo,那么所有继承的类也实现了该接口,这也代表Serializable;然而,为什么JDK中的子类会为每个子类重新定义它?不为继承类重新定义它有什么危险


共 (1) 个答案

  1. # 1 楼答案

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

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

    If a serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value for that class based on various aspects of the class, as described in the Java(TM) Object Serialization Specification. However, it is strongly recommended that all serializable classes explicitly declare serialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpected InvalidClassExceptions during deserialization.

    有关详细信息,请参见此处:

    What is a serialVersionUID and why should I use it?