2014-03-07 74 views
0

我記得我是否應該在這裏提出這個問題。我有一個擴展序列化的scala類,但是當我嘗試使用fileoutputstream保存類時,我一直在收到NotSerializableException。如何序列化scala BKTree?

class BKTree(terms: Seq[String], dist: (String, String) => Int = Levenshtein.distance) extends scala.serializable{ 

} 

class BKNode(val name: String,dist: (String, String) => Int = Levenshtein.distance) extends scala.serializable{ 

} 

object Levenshtein extends scala.serializable { 

} 

BKTree生成的作品完好無損,但試圖保存樹時會生成NotSerializableException。

回答

1
  1. 您應該擴展Serializable(或java.io.Serializable)。 serializable是不推薦的註釋。

  2. 您不能序列化任意函數(如dist)。

一個解決辦法,我可以建議:

// require that distance functions be serializable 
trait DistFunction extends (String, String) => Int with Serializable 

object Levenshtein { 
    val distance: DistFunction = ... 
} 

class BKTree(terms: Seq[String], dist: DistFunction) extends Serializable 

... 

請注意,你必須確保你的distance實現實際上序列化。

+0

我已經這樣做了。這兩個類都擴展了Serializable。 – Balaram26

+0

然後,你應該看看'Levenshtein.distance'的實現(或者樹使用的'dist'的任何函數)。它可能指的是一些不可序列化的對象。請參閱http://docs.scala-lang.org/sips/pending/spores.html#serialization –

+0

感謝您的評論。我明白,但有沒有其他的方式來在scala中序列化這些類?因爲我也嘗試過不同的可序列化庫。結果是類似的。 – Balaram26