Scala远程参与者消息类型问题

Scala远程参与者消息类型问题,scala,actor,Scala,Actor,所以我一直在玩远程角色,我遇到了一些序列化异常的困难。我的一条消息是一个case类的实例,它本身包含一个Path类列表的实例。路径类定义如下,本质上是具有预计算距离属性的点实例的集合: class Point (xi:Int,yi:Int) { val x: Int = xi val y: Int = yi // Determine distance to another point def distanceTo(p:Point):Int={ val dx = (x

所以我一直在玩远程角色,我遇到了一些序列化异常的困难。我的一条消息是一个case类的实例,它本身包含一个Path类列表的实例。路径类定义如下,本质上是具有预计算距离属性的点实例的集合:

class Point (xi:Int,yi:Int) {
  val x: Int = xi
  val y: Int = yi


  // Determine distance to another point
  def distanceTo(p:Point):Int={
    val dx = (x - p.x).toDouble
    val dy = (y - p.y).toDouble
    sqrt(dx*dx + dy*dy).round.toInt
  }
  override def equals(arg0:Any) : Boolean = {
    if (arg0.isInstanceOf[Point] && arg0.asInstanceOf[Point].x == x && arg0.asInstanceOf[Point].y == y) return true
    false
  }
} 
class Path(p: List[Point]) {
      val path: List[Point] = p
      val length: Int = Point.pathLength(p)
}
虽然这些类实例可以使用普通的参与者无问题地传递,但任何发送包含List[Path]集合的消息的尝试都会失败,并导致java.io.NotSerializableException

那我该怎么办?我需要为这些类定义序列化方法吗?除了通过网络发送类实例之外,还有更好的实践吗


任何帮助都将不胜感激——Scala remote actor的信息和示例似乎非常缺乏。

尝试对类使用@serialized注释。但是要小心,我有一个朋友在使用非平凡的序列化方法时遇到了各种各样的问题。保持不变,保持简单;)

为什么希望Path类是可序列化的?在Scala中,只有case类可以自动序列化。您需要将@serializable注释附加到Path(并为安全起见附加@SerialVersionUID),将Path声明为扩展java.io.serializable或java.io.Externalizable,或者将其设置为case类(从而免费获得serializable)

啊——我是个白痴——@serializable成功了。实际上,重新编译有问题的文件会有所帮助…

grr——我忘了——我确实在这两个类中都添加了@serialization。因此,我可以将其转换为如下内容:val z=新路径(List[Point](y))output.writeObject(z),其中output是ObjectOutputStrem实例。但当它作为信息发送时——没有骰子。相同的序列化错误。抱歉——请参阅对jsuereth的注释——没有骰子,即使它似乎可以与ObjectOutputStream.writeObject一起使用。