Scala远程演员消息类型的困境

时间:2010-08-29 23:42:38

标签: scala actor

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

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

虽然这些类实例可以在没有使用普通actor的issuse的情况下传递,但是任何尝试发送包含List [Path]集合的消息都会失败并显示java.io.NotSerializableException。

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

任何帮助都将非常感激 - 似乎真正缺少信息和Scala远程演员的例子。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

唉 - 我是个白痴 - @serializable做了伎俩。它实际上有助于重新编译有问题的文件......