java - 我在哪里可以设置流 classdesc serialVersionUID?

标签 java serialization

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

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

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

所以我的问题是:
1、什么是流classdesc serialVersionUID?
2、怎么设置才能让两个serialVersionUID一致?

谢谢!

最佳答案

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

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

一些可能的来源:

  • 来自其他计算机的网络消息与该类的序列化实例一起进入您的程序。 (这可能是原始套接字消息或 RMI 或任何使用 Java 序列化的内容。它不会是映射到该对象的 JSON 消息或 XML 消息。)
  • 另一个程序或您的程序的旧版本将类的一个实例写入磁盘上的文件(或以其他方式使用文件系统),并且您的程序没有检索它。
  • 你的程序有两个版本的 jar——一个旧的和一个新的——它们存在,通常是因为不同的类加载器。 (如果您不小心管理某种 Java EE 容器(包括 Tomcat 或 Jetty)上可用的所有类路径,就会发生这种情况。)

  • 这不是一个详尽的 list 。

    关于java - 我在哪里可以设置流 classdesc serialVersionUID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18621398/

    相关文章:

    java - 在哪里可以找到我可以在 JPA 中使用的属性名称?

    c++ - 错误 C228 : left of "must have class/struct/union several times

    java - 如果我的对象是可序列化的,我可以发送对象的 ArrayList<> 吗?

    java - Android,Java通过HttpClient-HttpPut

    java - Maven 版本 :prepare TAG before commit

    java - 异常已被其他异常错误捕获

    c# - 如何在没有模式信息的情况下将 c# 对象序列化为 xml?

    java - 当 String 是有效的 char 时将 String 转换为 char

    json - 复杂对象和集合的 Groovy/Grails JSON 转换

    c# - 如果实现对象不可序列化,我如何序列化基础对象?