Java 为什么要考虑方法名或为serialversionuid生成哈希
我有一节课Java 为什么要考虑方法名或为serialversionuid生成哈希,java,serialization,serialversionuid,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 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;
}
默认设置是确保序列化对象仅在它们来自完全相同的类时才兼容。为此,将考虑类的许多属性: 在任何情况下,如果使用序列化,则应根据 对于按方法名称和签名排序的每个非私有方法:
The name of the method.
The modifiers of the method written as a 32-bit integer.
The descriptor of the method.
在序列化过程中考虑公共方法的原因是它类似于一个契约。如果一个类建议了它所支持的公共方法,那么它不应该随着时间的推移而改变。如果这种情况发生变化,则必须更改该类的版本。问得好,但不幸的是,情况就是这样。在我看来,即使是在1997年,当时也没有充分考虑到这一点。解决方案通常是提供您自己的
serialVersionUID。
谢谢EJB,似乎这不是故意的,我找不到任何意义。