【问题标题】:Why is method name considered or generating the hash for serialversionuid为什么要考虑方法名称或为 serialversionuid 生成哈希
【发布时间】:2014-12-21 15:23:42
【问题描述】:

序列化时我有课

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

【问题讨论】:

  • 好问题,但不幸的是,事情就是这样。在我看来,即使在 1997 年,当时还没有充分考虑到这一点。一如既往的解决方案是提供您自己的serialVersionUID.
  • 感谢EJB,好像不是刻意做的,我没发现这有什么意义。

标签: java serialization serialversionuid


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    根据documentation

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-04-23
      • 1970-01-01
      • 2014-12-31
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2021-06-03
      相关资源
      最近更新 更多