scala类序列化,无法修复SerialVersionUID

发布于 2024-11-16 19:32:20 字数 594 浏览 4 评论 0原文

我目前正在测试远程参与者在 Android 和 Windows 之间进行通信。参与者远程发送不同的类,我在其中设置了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?或者也许还有另一个问题?

谢谢

I'm currently testing remote actors to communicate between Android and Windows. Actors remote sends differents classes where I set the serialVersionUID.

This is the code of my serialized class:

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

the problem is that the remote actors debug says there is a problem with incompatible class:

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

Why my SerialVersionUID doesn't matter for compiler?

How do I do to fix serialVersionUID? or maybe there is an another problem?

thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

写下不归期 2024-11-23 19:32:20

由于某种原因,使用长版本的 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

For some reason using the long version of 13, 13l, works better:

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

Tested in REPL with:

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

Update

I also tried to run it as a program; like this:

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)
}

... and got:

#1 6829060442504540290
#2 13
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文