5

我正在使用一个从 jar 实现 Serializable 的类,为了确保不会出现与编译器相关的问题,我给它一个 serialVersionUID private static final long serialVersionUID = 123L;

然后我重新创建了 jar,但是现在当我在新 jar 中使用该类时,它给了我异常:

java.io.InvalidClassException: com.placeiq.piqhash.PIQDeviceId; 本地类不兼容:流 classdesc serialVersionUID = 1568630193381428614,本地类 serialVersionUID = 123

所以我的问题是:1、什么是stream classdesc serialVersionUID?2、如何设置让两个serialVersionUID相同?

谢谢!

4

2 回答 2

5

该类的序列化版本来自某个地方(在流中),它的序列版本 ID 为 1568 ......但它不能反序列化为您的类版本(本地类),即 123。

您需要弄清楚其他版本的来源。然后,您需要使用您的新 jar,以及该类的新版本(如果可以的话)。

一些可能的来源:

  • 来自其他计算机的网络消息正在进入您的程序,并带有该类的序列化实例。(这可能是原始套接字消息或 RMI 或任何使用 Java 序列化的东西。它不会是映射到该对象的 JSON 消息或 XML 消息。)

  • 另一个程序或您的程序的旧版本将类的实例写入磁盘上的文件(或以其他方式使用文件系统)并且您的程序没有检索它。

  • 您的程序有两个版本的 jar - 一个旧版本和一个新版本 - 存在,通常是因为不同的类加载器。(如果您不小心管理某种 Java EE 容器(包括 Tomcat 或 Jetty)上所有可用的类路径,就会发生这种情况。)

这不是一个详尽的清单。

于 2013-09-04T18:42:10.140 回答
0

您必须在您的类中设置 serialVersionUID 以匹配您反序列化的类。在这种情况下,它应该是1568630193381428614,而不是123L

不过,我质疑这种方法的适当性。您可能只想引用供应商提供的实现,而不是尝试使用幻数匹配版本。特别是,您确定您实现了完全相同的属性和方法行为吗?

于 2013-09-04T18:42:31.547 回答