仅在eclipse中反序列化问题

时间:2011-10-14 04:41:55

标签: java eclipse rmi deserialization

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

然而,我遇到了这个问题,而且我一直在撞墙一段时间。我尝试将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

谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

    public static final long serialVersionUID = ...;

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