我刚刚遇到了“WTF”之类的错误:我更新了我的类的一个方法并添加了一个方法。运行我的程序后,当程序尝试打开和反序列化最近保存的数据(在方法更改之前)时,会弹出以下内容:
java.io.InvalidClassException: cz.autoclient.settings.Settings; local class incompatible: stream classdesc serialVersionUID = 2404650814140543454, local class serialVersionUID = 4256355437298300223
根据 java 文档的说法,java 方法没有被序列化。那么为什么 serialVersionUID
也考虑类方法呢?
既然 Java 程序员似乎对到处使用 getter 和 setter 如此着迷,为什么不能为 serialVersionUID
创建 getter,以便我可以实现自己的仅计算属性的算法?
serialVersionUID
can be overriden ,但仅限于 static Final long serialVersionUID
值,这需要我在更改类的属性时记住更改它。
最佳答案
根据 java 文档,他们建议尽可能使用自定义 serialVersionUID
,因为默认算法将采用类实现细节,并且据说结果因 JVM 实现而异。
default algorithm Java 用于生成 serialVersionUID
似乎也在考虑非私有(private)方法(步骤 7)。这解释了如果您在实现中使用默认 serialVersionUID
时出现的异常。
编辑:
正如您所建议的,如果我们可以拥有自己的方法实现来执行此操作,而不是将 serialVersionUID
重写为 static final long
,那就太好了。但我猜他们不允许这样做,因为如果允许的话,这种方法的错误实现可能会使 serialVersionUID
的整个目的失效。
关于java - 仅更改方法时出现本地类不兼容错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29664624/