【问题标题】:Deserialization issue only in eclipse仅在 Eclipse 中的反序列化问题
【发布时间】:2011-12-07 11:10:38
【问题描述】:

我通常构建一个 jar 并使用 ant 部署该 jar,但是我需要调试一个问题,因此我将代码放入 eclipse 并尝试运行 main 类(使用与我通常尝试运行的所有相同参数罐子)。

但是,我遇到了这个问题,并且我已经将头撞到墙上一段时间了。我尝试将private static final serialVersionUID 添加到466 ...,我还尝试将其设置为1L,并添加注释以忽略警告。

但是它一直在抛出InvalidClassException

有没有办法让 Eclipse 更像是在做 ant 构建的 java -jar myjar.jar。还有什么理由为什么会在这里发生这种情况? (这也是我用来运行 jar 的同一个 JVM)。

java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
    java.io.InvalidClassException: com.blah.MyClass local class incompatible: stream classdesc serialVersionUID = 46644259037142, local class serialVersionUID = -175274031382959

谢谢!

【问题讨论】:

    标签: java eclipse rmi deserialization


    【解决方案1】:

    看起来你的 jar 中有不同版本的类。确保这两个类匹配(并且与序列化此数据的版本相同)。

    这也是一些人不喜欢 Java 序列化的原因之一;)

    【讨论】:

      【解决方案2】:

      除非您明确指定相同的版本,否则即使稍微更改可序列化类也会更改SUID。如果此类用于反序列化使用旧版本创建的持久对象,则会收到您看到的错误。

      不清楚您如何尝试序列化/反序列化对象,但我猜它是 RMI 客户端-服务器类版本问题。是否为客户端和服务器部署了该类?

      【讨论】:

        【解决方案3】:

        eclipse 编译器不会生成与 javac 相同的 serialVersionUID,请参阅here。如果你想要 javac 和 eclipse 编译器之间的互操作性,定义

            public static final long serialVersionUID = ...;
        

        在所有可序列化的类中,它们都可以工作。

        【讨论】:

          猜你喜欢
          • 2013-12-25
          • 1970-01-01
          • 1970-01-01
          • 2011-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多