我通常构建一个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
谢谢!
答案 0 :(得分:1)
看起来你的jar中有不同版本的类。确保这两个类匹配(并且它与此序列化数据的版本相同)。
这是一些人不喜欢Java序列化的一个原因;)
答案 1 :(得分:1)
即使稍微更改可序列化类,也会更改SUID,除非您明确指定相同的版本。如果此类用于反序列化使用旧版本创建的持久对象,则会出现您看到的错误。
不清楚你是如何尝试序列化/反序列化对象的,但我猜它是一个RMI客户端 - 服务器类版本问题。是否为客户和客户部署了课程?服务器
答案 2 :(得分:0)
eclipse编译器不会生成与javac相同的serialVersionUID,请参阅here。如果你想在javac和eclipse编译器之间进行互操作,请定义
public static final long serialVersionUID = ...;
在所有可序列化的类中,它们都能正常工作。