我问这个的原因是因为我当前遇到此错误
java.io.InvalidClassException:com.my.package.TestObject;本地类不兼容:流classdesc serialVersionUID = 8401131515464509133,本地类serialVersionUID = 581907934314849590
之所以这样,是因为我正在从Redis缓存中读取对象的旧版本,但是我已将该对象更改为具有新字段-该类的旧版本最初没有serialVersionUID,因此它使用的是自动生成一个。
例如旧版本
public static class TestObject implements Serializable {
String id;
String name;
}
新版本
public static class TestObject implements Serializable {
String id;
String name;
String newField;
}
Q -所以我的问题是,如果我将private static final long serialVersionUID = 8401131515464509133L
添加到类中,则该对象的其他实例是否会出现问题?
编辑:我要问的主要问题是每次编译类时为自动生成的serialVersionUuid计算的值吗? 要么 每次编译我都可以依靠吗? (何时未添加新字段)?
答案 0 :(得分:-1)
是的,对于相同的JRE,您将为类看到相同的默认serialVersionUID。
否,对于不同的JRE版本。
在您的情况下,您可能可以定义应该有帮助的显式serialVersionUID,但是从您的问题来看,如果所有对象都已由同一JRE序列化,则这个问题并不明显。如果还没有危险,则如下所述,它在所有情况下都无济于事。
一旦更改了类的serialVersionUID,您就不能再反序列化较旧的对象事件,尽管该类的其余部分保持不变。使用默认的serialVersionUID也是危险的,因为它是由JVM计算的,例如在升级JRE版本时就不能保证一致性。
如果遇到对象序列化问题,可以尝试 http://marjavamitjava.com/make-java-runtime-ignore-serialversionuids-deserializing/
但是我宁愿使用与Java本机二进制文件不同的序列化程序。