Scala类序列化,无法修复SerialVersionUID。

8

我目前正在测试远程actor在Android和Windows之间进行通信。Actors remote发送不同的类,我在其中设置了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?还是有其他问题?

谢谢


2
你可以直接编写长字面量:13L 是一个长整型值。不过这对你的问题应该没有影响。 - Dirk
1个回答

4

由于某种原因,使用长版本的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,因为序列化正在寻找的是long而不是int。 - user207421
但是13.asInstanceOf[Long]也是一个long,但它会默默地忽略它。在Java中,由于非常量表达式,您会收到错误。我不得不在非REPL环境中尝试它,但我得到了相同的结果。 - thoredge
显然问题不在我的类上,而是远程演员的内部类。 我认为问题出在scala.actors.remote.Node类上。看看这个异常:捕获到java.io.InvalidClassException: scala.actors.remote.Node,有什么解决办法吗? - reevolt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接