对于同一类的所有实例,自动生成的serialVersionUID是否总是相同?

时间:2019-07-02 15:09:34

标签: java serialization

我问这个的原因是因为我当前遇到此错误

  

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计算的值吗? 要么 每次编译我都可以依靠吗? (何时未添加新字段)?

1 个答案:

答案 0 :(得分:-1)

是的,对于相同的JRE,您将为类看到相同的默认serialVersionUID。

否,对于不同的JRE版本。

在您的情况下,您可能可以定义应该有帮助的显式serialVersionUID,但是从您的问题来看,如果所有对象都已由同一JRE序列化,则这个问题并不明显。如果还没有危险,则如下所述,它在所有情况下都无济于事。

一旦更改了类的serialVersionUID,您就不能再反序列化较旧的对象事件,尽管该类的其余部分保持不变。使用默认的serialVersionUID也是危险的,因为它是由JVM计算的,例如在升级JRE版本时就不能保证一致性。

如果遇到对象序列化问题,可以尝试 http://marjavamitjava.com/make-java-runtime-ignore-serialversionuids-deserializing/

但是我宁愿使用与Java本机二进制文件不同的序列化程序。