Scala Remote Actor Тип сообщения горе - PullRequest
2 голосов
/ 30 августа 2010

Так что я играл с удаленными актерами и столкнулся с некоторыми трудностями с исключениями сериализации. Одно из моих сообщений - это экземпляр класса case, который сам содержит экземпляр списка классов 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)
}

Хотя эти экземпляры класса могут передаваться без проблем с использованием обычных акторов, любая попытка отправить сообщение, содержащее коллекцию List [Path], завершается неудачно с java.io.NotSerializableException.

Так что мне делать? Нужно ли определять методы сериализации для этих классов? Есть ли лучший способ для этой цели, кроме отправки экземпляров классов по сети?

Любая помощь будет принята с благодарностью - похоже, существует реальная нехватка информации и примеров материалов для удаленных актеров Scala.

Ответы [ 3 ]

2 голосов
/ 30 августа 2010

Почему вы ожидаете, что ваш класс Path будет сериализуем? Только классы дел автоматически сериализуются в Scala. Вам необходимо либо прикрепить аннотацию @serializable к Path (и @SerialVersionUID для безопасности), объявить Path как расширяющий java.io.Serializable или java.io.Externalizable, либо сделать его классом case (таким образом, получая сериализуемость бесплатно).

1 голос
/ 30 августа 2010

Argh - я идиот - @serializable сделал свое дело.Это помогло бы перекомпилировать файл, о котором идет речь ...

1 голос
/ 30 августа 2010

Попробуйте использовать аннотацию @serialized для классов.Однако будьте осторожны, у меня есть друг, который сталкивался со всевозможными проблемами с нетривиальными сериализованными методами.Оставайся неизменным и будь простым;)

...