序列化:InvalidClassException scala

时间:2013-02-06 10:34:22

标签: scala serialization serialversionuid

为什么我收到此错误?

Serialization Problem 
  java.io.InvalidClassException: scala.reflect.ClassTypeManifest; 
  local class incompatible: stream classdesc serialVersionUID =

使用intellij

2 个答案:

答案 0 :(得分:2)

让我猜一下:你序列化了(通过java的内置序列化)一个包含ClassManifest(从谁ClassTypeManifest是子类型)到文件(或数据库)的类,然后升级了你的scala版本,现在正在尝试反序列化该文件,对吧? 或者您正在从一个JVM进程向另一个JVM进程发送序列化对象,并且它们运行不同版本的scala。

好吧,不要这样做。 第一个原因是ClassTypeManifest没有声明明确的serialVersionUID字段(请参阅What is a serialVersionUID and why should I use it?),这清楚地表明对类的任何更改都可能会更改序列化格式。你真的不能期望在ClassTypeManifest的被清除的流中有任何向后兼容性。 另外,在scala中,2.10 ClassManifest甚至不再是一个类:它只是ClassTag的一个别名,它是一个显着不同的类。

实际上,不要期望能够序列化(使用java的序列化)ClassManifest并使用另一个版本的scala读回来。

如果您确实需要使用java反射,则可以尝试将ClassManifest字段替换为java.lang.Class字段(始终可以安全地序列化/反序列化)。

否则,您可以考虑使用其他序列化库。

答案 1 :(得分:0)

我解决了这个问题。解决方案是使用Maven生命周期清理,然后安装。