2010-08-29 73 views
2

所以我一直在玩遙控演員,我遇到了一些序列化異常的困難。我的一條消息是case類的一個實例,它本身包含一個Path類列表的實例。 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) 
} 

雖然這些類的實例可以使用普通的演員那樣來傳遞,沒有issuse,任何試圖發送消息包含List [Path]集合將失敗,並顯示java.io.NotSerializableException。

那麼我該怎麼做?我是否需要爲這些類定義序列化方法?除了通過電線發送類實例之外,還有更好的做法嗎?

任何幫助將不勝感激 - 似乎有真正的信息缺乏和斯卡拉遠程演員的東西的例子。

回答

1

嘗試使用@serialized註釋到類中。不過要小心,我有一位朋友用不小的序列化方法遇到了各種各樣的問題。保持不變,保持簡單;)

+0

grr - 我忘了 - 我做了*添加@serialization這兩個類。所以我實際上可以這樣: val z = new Path(List [Point](y)) output.writeObject(z) 其中output是ObjectOutputStrem實例。但是,當這被作爲一個信息發送 - 沒有骰子。相同的序列化錯誤。 – hayzeus 2010-08-30 01:22:55

2

你爲什麼期望你的Path類是可序列化的?只有case類可以在Scala中自動序列化。您需要將@serializable註釋附加到Path(以及@SerialVersionUID以確保安全),將Path聲明爲擴展java.io.Serializable或java.io.Externalizable,或將其設置爲案例類(從而免費獲得可串行化)。

+0

對不起 - 查看評論jsuereth - 沒有骰子,即使它似乎與ObjectOutputStream.writeObject一起使用。 – hayzeus 2010-08-30 01:24:06

1

呃 - 我是一個白癡 - @ serialize做了伎倆。這將有助於實際重新編譯有問題的文件...