8

私は現在、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 を修正するにはどうすればよいですか? または多分別の問題がありますか?

ありがとう

4

1 に答える 1

4

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
于 2011-06-23T15:21:25.560 に答える