【问题标题】:scala class serialization, impossible to fix SerialVersionUIDscala类序列化,无法修复SerialVersionUID
【发布时间】:2011-09-21 01:36:05
【问题描述】:

我目前正在测试远程 Actor 以在 Android 和 Windows 之间进行通信。 Actors 远程发送不同的类,我在其中设置了 serialVersionUID。

这是我的序列化类的代码:

@SerialVersionUID(13.asInstanceOf[Long]) case class IdentifyMessage(userName : String, user : User, code : Int)

问题是远程参与者调试说存在不兼容类的问题:

caught java.io.InvalidClassException: scala.actors.remote.Node; local class incompatible: 
stream classdesc serialVersionUID = -6610463074147725500, local class serialVersionUID = -7525549079045563153

为什么我的 SerialVersionUID 对编译器没有影响?

如何修复serialVersionUID?或者可能还有其他问题?

谢谢

【问题讨论】:

  • 你可以直接写长文本:13L 是一个长值。不过,这对你的问题应该没关系。

标签: scala serialization serialversionuid remote-actors


【解决方案1】:

出于某种原因,使用 13、13l 的长版本效果更好:

@SerialVersionUID(13l) case class IdentifyMessage(userName : String, user : User, code : Int)

在 REPL 中测试:

java.io.ObjectStreamClass.lookup(IdentifyMessage("hei", User(), 8).getClass).getSerialVersionUID()

更新

我也尝试将它作为程序运行;像这样:

object SerialTest extends App {
  case class User()
  @SerialVersionUID(13.asInstanceOf[Long]) case class IdentifyMessage1(userName: String, user: User, code: Int)
  @SerialVersionUID(13l) case class IdentifyMessage2(userName: String, user: User, code: Int)
  println("#1 " + java.io.ObjectStreamClass.lookup(IdentifyMessage1("hei", User(), 8).getClass).getSerialVersionUID)
  println("#2 " + java.io.ObjectStreamClass.lookup(IdentifyMessage2("hei", User(), 8).getClass).getSerialVersionUID)
}

...得到:

#1 6829060442504540290
#2 13

【讨论】:

  • 原因是它导致底层变量被声明为 long,因为序列化正在寻找,而不是 int。
  • 但是 13.asInstanceOf[Long] 也是很长的,它仍然默默地忽略它。在java中你会因为非常量表达式而得到一个错误。我不得不在非 REPL 环境中尝试,但得到了相同的结果。
  • 显然问题不是我的班级,而是远程演员的内部班级。我认为问题是 scala.actors.remote.Node 类。看一下这个异常:抓到java.io.InvalidClassException: scala.actors.remote.Node,有没有解决办法?
猜你喜欢
  • 2016-08-22
  • 2017-07-15
  • 2018-03-25
  • 2015-04-21
  • 2016-12-14
  • 2010-10-01
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
相关资源
最近更新 更多