问题标签 [serialversionuid]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
12 回答
33760 浏览

java - 使用 serialVersionUID 还是禁止警告?

我想创建一个类,例如,扩展 HttpServlet?我的编译器警告我,我的类应该有一个 serialVersionUID。如果我知道这个对象永远不会被序列化,我应该定义它还是添加注释来禁止这些警告?

你会做什么,为什么?

0 投票
6 回答
3456 浏览

java - 查找哪个 jar 中的哪个类具有给定的 serialVersionUID

当我得到一个 java.io.InvalidClassException 时,它给了我它想要的 serialVersionUID,以及它得到的 serialVersionUID。有没有一种简单的方法可以判断我的几十个 jar 中的哪一个使用了错误的 serialVersionUID?

更新:我应该提到我们的意图是同时更新所有内容,但我正在尝试调试我们构建和部署过程中的问题。

0 投票
26 回答
1043940 浏览

java - 什么是 serialVersionUID,我为什么要使用它?

serialVersionUID缺少 a 时 Eclipse 会发出警告。

可序列化类 Foo 未声明 long 类型的静态最终 serialVersionUID 字段

什么是serialVersionUID它以及为什么它很重要?请展示一个缺少serialVersionUID会导致问题的示例。

0 投票
6 回答
6879 浏览

java - 显式的serialVersionUID 被认为是有害的?

在我看来,为新类明确指定 serialVersionUID 是不好的。考虑两种情况,当布局有它应该改变时不改变它,当它不应该改变它时改变它。

当它应该被改变时不改变几乎只发生在它是明确的时候。在这种情况下,它会导致一些非常微妙、难以发现的错误。特别是在开发过程中,当类布局经常变化时。但是如果没有明确指定,它会改变并且反序列化会大声中断,很可能通过清除存储库来解决。

几乎只有在它是隐式的时候才会在不应该的时候改变它。这是类布局已更改但我们仍希望从旧的序列化 blob 中反序列化的罕见情况。这可能会在 QA 期间被捕获(从 5.2 升级到 5.2.1 后出现奇怪的错误,请参阅附加的堆栈跟踪),并且可以通过设置显式值来轻松修复。

评论?

0 投票
4 回答
5770 浏览

java - Java - 修改二进制序列化对象的 serialVersionUID

几个月前,我将一个 java.io.Serializable 对象序列化到一个文件中。现在我需要阅读内容,但从那以后 serialVersionUID 发生了变化,现在我收到“类不兼容”错误。我知道所有数据成员都没有改变,所以唯一的障碍是 serialVersionUID 检查。

有没有办法禁用检查或修改二进制文件中的 serialVersionUID?

澄清

这个问题假设我无法编辑源。有没有办法破解 .class 文件或破解序列化的目标文件(使用十六进制编辑器并在某个偏移量处更改值)?

0 投票
6 回答
11291 浏览

java - 当对象具有不同的serialVersionUID时,如何反序列化保存在数据库中的对象

我的客户端有一个 oracle 数据库,并且一个对象通过 objOutStream.writeObject 作为 blob 字段持久化,该对象现在有一个不同的serialVersionUID(即使对象没有变化,可能是不同的 jvm 版本),当他们尝试反序列化一个抛出异常:

他们从一开始就没有为它分配一个固定的值,serialVersionUID所以现在有些东西改变了,抛出了异常。现在他们不想丢失任何数据,为此我认为最好的方法是读取对象,反序列化它们,然后通过 XMLEncoder 再次持久化它们,以避免将来出现诸如当前“类不兼容”错误之类的错误。

显然,该对象的持久化有 2 个不同的值,serialVersionUID所以我想读取数据,尝试使用一个值,如果失败,则尝试使用另一个值,为此,我尝试serialVersionUID使用 ASM 接口。我已经能够更改该值,但问题是如何对类进行主动更改,因此当它被反序列化时,objInpStr.readObject()将我修改后的类的版本与我的特定serializedVersionUID. 我做了一个测试类来模拟真实环境,我取一个对象(它具有不同serialVersionUID问题的对象作为属性)对象名称是Reservation属性 CommissionResult

测试应该因java.io.InvalidClassException“本地类不兼容”而失败,因为我serialVersionUID在保存文件并使用新文件读取 de 文件后更改了它,但它没有失败,因此这意味着ObjectInputStream.readObject没有使用我修改后的Reservation类版本。

有任何想法吗?提前致谢。

!!!!!!!!!!!!!更新:

好的,可以重新定义 resultClassDescriptor 以覆盖流 serialVersionUID,但是,发生了一些奇怪的事情,正如我之前所说,似乎有 2 个版本的类持久化,serialVersionUID = -5239021592691549158L 的对象和其他值为 8452040881660460728L 的对象最后value 是如果我没有为本地类指定值时生成的值。

- 如果我没有为 serialVersionUID 指定值,则使用默认值 (8452040881660460728L),但无法解除具有其他值的对象,则会引发错误,指出属性属于其他类型。

- 如果我指定值 -5239021592691549158L,则使用该值持久的类将成功反序列化,但其他类则没有,相同的类型错误。

这是错误跟踪:

可能致命的反序列化操作。java.io.InvalidClassException:覆盖序列化类版本不匹配:本地 serialVersionUID = -5239021592691549158 流 serialVersionUID = 8452040881660460728 java.lang.ClassCastException:无法将 java.util.HashMap 的实例分配给字段 com.posadas.ic.rules.common.commisionRules。 com.posadas.ic.rules.common.commisionRules.CommissionResult 实例中 java.lang.String 类型的 CommissionResult.statusCode

抛出此错误时,该类的值为-5239021592691549158,如果将值更改为8452040881660460728,则该类已成功反序列化,那么会发生什么?为什么那个错误会试图转换为错误的类?

谢谢

0 投票
11 回答
88160 浏览

java - 为什么生成 long serialVersionUID 而不是简单的 1L?

当类在 Eclipse 中实现 Serializable 时,我有两个选择:添加默认值serialVersionUID(1L)或生成serialVersionUID(3567653491060394677L)。我认为第一个更酷,但很多时候我看到人们使用第二个选项。有什么理由生成long serialVersionUID吗?

0 投票
4 回答
19932 浏览

java - 抽象类是否应该有一个 serialVersionUID

在java中,如果一个类实现了Serializable但是是抽象的,它应该有一个长声明的serialVersionUID,还是子类只需要这个?

在这种情况下,确实是所有子类都处理序列化,因为类型的目的是在 RMI 调用中使用。

0 投票
3 回答
2393 浏览

java - 添加一个方法会改变我的类上的 java 计算的 serialVersionUid 吗?

如果我有这样的课程:

如果我添加另一种方法(并且没有其他字段),其计算的 serialVersionUID 会改变吗?

例如,添加方法:

或者,是否有一个很好的工具来解决这个问题?

0 投票
9 回答
19991 浏览

java - 查找序列化对象的serialVersionUID

有没有办法确定生成serialVersionUID的序列化 Java 对象?

问题是我序列化了一个对象而没有明确指定serialVersionUID. 现在反序列化过程抱怨类不兼容。但是,我没有以使其不兼容的方式更改课程。所以我假设serialVersionUID在类中指定它就足够了,因为它存储在对象数据中。为了做到这一点,我需要serialVersionUID从序列化数据中读取。