gpt4 book ai didi

java - 不同 Java 版本的不同serialVersionUID

转载 作者:行者123 更新时间:2023-11-30 07:58:16 24 4
gpt4 key购买 nike

我在 Java 序列化/反序列化方面遇到了一个奇怪的问题。

除了序列化和正确使用serialVersionUIDs的所有其他问题之外,这种行为对我来说是全新的:

在一台机器上运行我的软件 (openSuse 13.1),更新将 Java 版本切换到 Java 8。现在,如果我尝试重新打开该软件的项目文件(这是一个序列化的 Java 对象),因为其中包含的类之一具有错误的serialVersionUID。奇怪的是,这些类是来自外部库的类,并且几个月没有更改(但没有硬编码的serialVersionUID字段)。

如果我在那台机器上切换回 Java 7,则不会发生该错误。我可以在使用 openSuse 13.1 + Java 8 的其他计算机上重现该错误,但不能在使用 Java 8(或 Java 7)的 Windows 或其他 Linux 发行版(如 Ubuntu)的计算机上重现该错误。

在所有机器上都安装了官方的 sun/oracle JRE 软件包。

那么,有人在任何时候遇到过这个问题吗?我不认为这是 Java 8 中的错误,因为它只发生在 openSuse 13.1 机器上。但是 openSuse 的人怎么会搞乱他们的系统,以至于 java 会以与以前不同的方式对类进行哈希处理(因为 Java 在新版本中没有改变这个过程)?

编辑:需要明确的是,导致问题的类来自外部库。一个月来没有变化。解决方案不能是定义一个serialVersionUID,因为该错误有其他一些来源并且仍然存在。我认为,它不会停止于这个类,它会影响我使用的库中没有定义的serialVersionUID的所有类

编辑2:这是确切的错误:

java.io.InvalidClassException: edu.uci.ics.jung.graph.util.Pair; local class incompatible: stream classdesc serialVersionUID = 7664847375082415686, local class serialVersionUID = -638192081897624765 

在所有其他机器上我可以测试它,该类的哈希serialVersionUID为7664847375082415686,只有openSuse 13.1 + Java 8得到的结果为-638192081897624765

最佳答案

has anybody faced that problem at any time?

你没有发现这个问题已经做得很好了。所有 IDE 都会对带有serialVersionUID AFAIK 的可序列化类发出警告。这是一个常见的问题,或者更确切地说,人们通常对serialVersionUID进行硬编码,这样他们就看不到它。注意:Eclipse 和 Oracle JDK 为同一版本的 Java 生成不同的 UID。

because it only occurs on an openSuse 13.1 machine.

这将是非常令人惊讶的。相同版本的 Java 应在每个操作系统上生成相同的serialVersionUID。

注意:您可以将serialVersionUID 设置为您需要的任何内容。例如假设您需要读取具有给定serialVersionUID的对象,您可以将其设置为期望的UID,它将尝试读取您想要的任何版本。

关于java - 不同 Java 版本的不同serialVersionUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32332715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com