为什么Java在Exception和Throwable类中声明了serialVersionUID?

时间:2015-06-21 08:19:55

标签: java serialization deserialization serialversionuid

当我创建一个自定义异常类时,如下所示

public class MyApppException extends Exception {

    private String message = null;

    public MyApppException() {
        super();
    }
    public MyApppException(String message) {
        super(message);
        this.message = message;
    }
    public MyApppException(Throwable cause) {
        super(cause);
    }
}

编译器让我失望

  

可序列化类InsufficientBalanceException不声明long类型的静态最终serialVersionUID字段

从Java doc我理解 serialVersionUID

的含义
  

序列化运行时将每个可序列化类与版本号相关联,称为serialVersionUID,在反序列化期间使用该版本号来验证序列化对象的发送方和接收方是否已加载与该序列化兼容的该对象的类。如果接收者为具有与相应发送者类的serialVersionUID不同的对象加载了一个类,则反序列化将导致InvalidClassException。可序列化类可以通过声明名为“serialVersionUID”的字段来明确声明其自己的serialVersionUID,该字段必须是static,final和long类型:

但是我不明白为什么Java在 Exception Throwable 类中声明了serialVersionUID? serialWersionUID在例外 Throwable 类中有什么用?真的需要吗?如果有,为什么?有人请澄清。

例外

public class Exception extends Throwable {
    static final long serialVersionUID = -3387516993124229948L;

可投掷

public class Throwable implements Serializable {
    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -3042686055658047285L;

1 个答案:

答案 0 :(得分:2)

您的自定义异常可以具有状态(=实例变量),它们可以是您希望与异常一起记录的其他信息。状态是序列化的。并且您可以在创建应用程序的新版本时更改状态(例如,添加新变量),以便加载序列化异常的类,需要知道它加载的版本是否与JVM的类定义兼容具有。