【问题标题】:Serialization : InvalidClassException scala序列化:InvalidClassException scala
【发布时间】:2013-01-21 12:30:04
【问题描述】:
为什么会出现这个错误?
Serialization Problem
java.io.InvalidClassException: scala.reflect.ClassTypeManifest;
local class incompatible: stream classdesc serialVersionUID =
使用智能
【问题讨论】:
标签:
scala
serialization
serialversionuid
【解决方案1】:
让我猜猜:您将包含ClassManifest(ClassTypeManifest 是其子类型)的类(通过 java 的内置序列化)序列化为文件(或数据库),然后升级您的 scala 版本,然后现在正在尝试反序列化该文件,对吗?
或者您正在将一个序列化对象从一个 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 字段(序列化/反序列化始终是安全的)。
否则,您可以考虑使用其他序列化库。
【解决方案2】:
我解决了这个问题。解决方案是使用 Maven 生命周期清理,然后安装。