java - 仅更改方法时出现本地类不兼容错误

标签 java backwards-compatibility serializable

我刚刚遇到了“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/

相关文章:

elasticsearch - _type在ElasticSearch中的使用范围从5.5到7.7

ruby - 在 Ruby 1.8 中支持 Ruby 1.9 的哈希语法

flutter - 具有json_serializable的复杂模型-List <objects>不转换为映射

java - 如何搭建Jetty开发环境?

java - 数据集 <行> 和 JavaRDD <行> : how to eliminate the header

android - 如何创建支持旧 API 级别(例如 23 级)的 Android 通知

c# - 为什么我不能在同一个类上使用 WCF DataContract 和 ISerializable?

java - Java中serialVersionUID是如何序列化的?

java - 如何为同一布局中的多个按钮设置全局点击监听器?

java - OpencCv - 将像素映射到 `warpAffine` 或 `warpPerspective` 之后的新位置(投影变换/形态操作)