我正在建立一个游戏!使用Play的框架应用! 2.2.1,sbt 0.13.0,我的本地版本的scala是2.10.3。
在反序列化我从同事继承的特定文件时遇到了一个serialVersionUID问题来处理这个项目(我不知道是谁创建了这个序列化文件(或什么时候))。
我的错误讯息,在Play!中构建时:
Caused by: java.io.InvalidClassException: scala.collection.mutable.WrappedArray$ofRef; local class incompatible: stream classdesc serialVersionUID = 8184381945838716286, local class serialVersionUID = -8707880168089396949
经过多次搜索,我发现这个补丁应该修复错误SI-5046:
https://issues.scala-lang.org/browse/SI-5046
我从github为分支2.10.x下载了scala源代码,我在这里将补丁应用到WrappedArray.scala:scala / src / library / scala / collection / mutable / WrappedArray.scala
如何处理此修改过的源代码,以便我可以在Play中使用它!应用
* 编辑#1:
我按照@Alexey Romanov的链接
当我编译Play时,我仍然收到有关WrappedArray $ ofRef的错误消息,尽管现在它是一个不同的错误消息。这是我做的:
我使用ant重建了scala发行版:
ant build
ant partialdist
然后在Play!我通过将以下内容添加到我的Build.scala文件中来指定用于SBT和插件的scala版本:
scalaVersion := "2.10.3"
autoScalaLibrary := false
scalaHome := Some(file("/path_to_my_rebuilt_scala_distribution"))
现在我的错误信息是:
Caused by: java.io.InvalidClassException: scala.collection.mutable.WrappedArray$ofRef; incompatible types for field bitmap$0
编辑#2:
我正在向下移动Scala版本,当我到达2.9.2时,通过应用补丁修复了有关WrappedArray $ ofRef的错误。现在我收到另一个类的另一个序列化错误:
java.io.InvalidClassException: scala.Symbol; local class incompatible: stream classdesc serialVersionUID = -3681772905693662441, local class serialVersionUID = 7747205442425187939
我将转到Scala 2.9.1,看看我是否可以使用该版本获取该文件的内容。
* 编辑#3:
在scala版本2.9.1-1中,我收到了不同的序列化错误:
java.io.InvalidClassException: scala.Tuple2; local class incompatible: stream classdesc serialVersionUID = 3990034604647285925, local class serialVersionUID = 5867822941721784448
不知道接下来要尝试什么...继续下去scala版本,还是有其他建议?
答案 0 :(得分:1)
To use a local Scala installation for building a project
定义scalaHome
:
scalaHome := Some(file("/path/to/scala/home/"))
如果您最终还要重建Play,请参阅How can I change version of Scala that is used by Play, SBT and its plugins?。
编辑:我实际看了一下bug描述。看起来补丁将允许序列化/反序列化由两个不同的Scala版本创建的WrappedArray
,这两个版本都包含此补丁。从那以后
(我不知道是谁创建了这个序列化文件(或何时))
它可能不适合你。从新的错误消息判断,可能是Scala的版本被序列化,只是没有包含字段2.10.3,并且无法反序列化。我最好的建议是尝试使用不同的Scala版本进行反序列化(可能不是2.10。*,因为它们是二进制兼容的),看看哪个版本有效。