2014-03-07 39 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