3

我在序列化时有一堂课

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;
}
4

2 回答 2

2

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

无论如何,如果你使用序列化,你应该定义你自己的 id。

于 2014-10-26T07:35:42.010 回答
0

根据文档

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

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

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

于 2015-08-12T08:57:28.077 回答