【问题标题】:Scala Remote Actor Message type woesScala Remote Actor 消息类型问题
【发布时间】:2010-08-29 23:42:38
【问题描述】:

所以我一直在玩远程演员,并且在序列化异常方面遇到了一些困难。我的一条消息是一个案例类的实例,它本身包含一个路径类列表的实例。 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 毫无问题地传递,但任何发送包含 List[Path] 集合的消息的尝试都会失败,并出现 java.io.NotSerializableException。

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

任何帮助都将不胜感激 - Scala 远程参与者的信息和示例似乎确实缺乏。

【问题讨论】:

    标签: scala actor


    【解决方案1】:

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

    【讨论】:

    • 抱歉 -- 请参阅对 jsuereth 的评论 -- 没有骰子,即使它似乎与 ObjectOutputStream.writeObject 一起使用。
    【解决方案2】:

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

    【讨论】:

    • grr -- 我忘了 -- 我确实在两个类中都添加了@serialization。所以我实际上可以这样: val z = new Path ( List[Point](y) ) output.writeObject(z) 其中输出是一个 ObjectOutputStrem 实例。但是当它作为消息发送时 - 没有骰子。同样的序列化错误。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 2015-01-06
      • 2021-11-22
      • 2013-01-05
      • 2010-11-03
      • 1970-01-01
      相关资源
      最近更新 更多