我正在使用一个从jar实现Serializable的类,并确保不会出现与编译器相关的问题,我给它一个serialVersionUID private static final long serialVersionUID = 123L;
然后我重新创建了jar,但现在当我在新jar中使用类时,它给了我异常:
java.io.InvalidClassException:com.placeiq.piqhash.PIQDeviceId;本地类不兼容:stream classdesc serialVersionUID = 1568630193381428614,本地类serialVersionUID = 123
所以我的问题是: 1,什么是流classdesc serialVersionUID? 2,如何设置它以使两个serialVersionUID相同?
谢谢!
答案 0 :(得分:3)
该类的序列化版本来自某个地方(在流中)并且它的序列版本ID为1568 ......但它无法反序列化为您的类版本(本地类),即123。
您需要弄清楚其他版本的来源。然后你需要使用你的新jar,使用新版本的类(如果可以的话)。
一些可能的来源:
来自其他计算机的网络消息将通过该类的序列化实例进入您的程序。 (这可能是原始套接字消息或RMI或使用Java序列化的任何内容。它不会是映射到该对象的JSON消息或XML消息。)
您的程序的另一个程序或旧版本将该类的实例写入磁盘上的文件(或以其他方式使用文件系统),并且您的程序没有检索它。
你的程序有两个版本的jar - 一个旧的和一个新的 - 存在,通常是因为不同的类加载器。 (如果您不小心管理某种类型的Java EE容器上可用的所有类路径,包括Tomcat或Jetty,就会发生这种情况。)
这不是一份详尽的清单。
答案 1 :(得分:0)
您必须在类中设置serialVersionUID以匹配反序列化的类。在这种情况下,它应该是1568630193381428614
,而不是123L
。
尽管如此,我怀疑这种方法是否合适。您可能只想引用供应商提供的实现,而不是尝试使用幻数匹配版本。特别是,您确定已实现完全相同的属性和方法行为吗?