为什么Java在Exception和Throwable类中声明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类型的静态final serialVersionUID字段

从Java文档我明白serialVersionUID的含义

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

但我不明白为什么Java在ExceptionThrowable类中声明serialVersionUID? ExceptionThrowable类中serialVersionUID的用法是什么? 它真的需要吗? 如果是,为什么? 有人请澄清。

例外

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

Throwable的

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

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

链接地址: http://www.djcxy.com/p/4081.html

上一篇: why Java declared serialVersionUID in Exception and Throwable class?

下一篇: serialVersionUID field warning in eclipse