所以我一直在玩远程演员,我遇到了序列化异常的一些困难。我的一条消息是案例类的实例,它本身包含一个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远程演员的例子。
答案 0 :(得分:2)
为什么您希望Path类可序列化?只有案例类可以在Scala中自动序列化。您需要将@serializable注释附加到Path(以及@SerialVersionUID以确保安全),将Path声明为扩展java.io.Serializable或java.io.Externalizable,或将其设置为案例类(从而获得免费的可串行化)。
答案 1 :(得分:1)
尝试将@serialized注释用于类。但是要小心,我有一个朋友用非平凡的序列化方法遇到了各种各样的问题。保持不变,保持简单;)
答案 2 :(得分:1)