Java serialVersionUid和包含的类

问题描述 投票:1回答:1

请考虑以下代码:

class TestSUid implements Serializable {

    private static final Long serialVersionUID =101010101010L; 
    private String title;
    private Error error;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Error getError() {
        return error;
    }

    public void setError(Error error) {
        this.error = error;
    }
}

class Error implements Serializable {
    private String title;
    private String message;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

现在,我的目标是序列化TestSUid类,以便可以启用脱机缓存。如果我也需要向我的Error类添加serialVersionUID,我会感到困惑。如果我以后需要更新错误类怎么办,更新TestSUid版本ID就足够了吗?

我在以下位置查阅了该参考文献:https://docs.oracle.com/javase/8/docs/platform/serialization/spec/version.html#a6678

但是仍然不完全自信。

java serialization
1个回答
1
投票

您指向的参考列出了当类serialVersionUID相同时兼容和不兼容的更改。因此,如果您想在将来进行任何兼容的更改(例如,向类中添加字段)并且仍然能够反序列化旧数据,则还应该将serialVersionUID添加到将要更改的类中(在这种情况下,以及Error类)。另外:

  1. 根据Serializable javadoc,应使用基本类型long,而不是类Long
  2. 如果更新TestSUid版本ID,您将不再能够读取旧版本的序列化数据。您将得到一个例外:java.io.InvalidClassException: TestSUid; local class incompatible: stream classdesc serialVersionUID = <old_version>, local class serialVersionUID = <new_version>
  3. 如果不更新TestSUid版本ID并向Error类添加一个附加字段,则计算得出的(如果未声明)serialVersionUID与以前不同,您将从pt中获取错误。 2。
© www.soinside.com 2019 - 2024. All rights reserved.