为什么要考虑方法名称或为serialversionuid生成哈希

时间:2014-10-26 07:32:10

标签: java serialization serialversionuid

序列化时我有一个课

public class Name implements Serializable {
    private final String firstName;
    private final String lastName;

    public Name(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }
}

但是在反序列化时我有一个额外的方法(下面提到),它不会以任何方式影响对象状态,序列化就是存储对象状态,那么为什么额外的方法在serialversionuid的哈希生成中有贡献。在当前场景中,它将因InvalidClassException而失败。但是这个额外的方法不会改变对象状态。

public String getFullName() {
    return firstName + " " + lastName;
}

2 个答案:

答案 0 :(得分:2)

默认设置是确保序列化对象只有来自完全相同的类才兼容。为此,我们考虑了该类的许多属性:https://docs.oracle.com/javase/6/docs/platform/serialization/spec/class.html#4100

在任何情况下,如果您使用序列化,则应定义自己的ID。

答案 1 :(得分:0)

根据documentation

  

对于按方法名称和签名排序的每个非私有方法:

The name of the method.
The modifiers of the method written as a 32-bit integer.
The descriptor of the method. 

在序列化中考虑公共方法的原因是因为它就像合同。如果一个类已经建议它支持的公共方法,它不应该随时间变化。如果更改,则必须更改类的版本。