4

我正在构建一个游戏!使用 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

然后在玩!通过将以下内容添加到我的 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 版本,还是有其他建议?

4

1 回答 1

1

要使用本地 Scala 安装来构建项目,请 定义scalaHome

scalaHome := Some(file("/path/to/scala/home/"))

另请参阅如何更改 Play、SBT 及其插件使用的 Scala 版本?如果您最终也不得不重建 Play。

编辑:我实际上查看了错误描述。看起来该补丁将允许WrappedArray由两个不同的 Scala 版本创建的序列化/反序列化,这两个版本都包含这个补丁。自从

(我不知道是谁创建了这个序列化文件(或何时))

它可能对你不起作用。从新的错误信息来看,可能是它被序列化的 Scala 版本根本不包含 2.10.3 的字段,并且无法反序列化。我最好的建议是尝试使用不同的 Scala 版本进行反序列化(可能不是 2.10.*,因为它们是二进制兼容的),然后看看哪个有效。

于 2014-01-07T06:49:38.340 回答