【问题标题】:How to serialize scala BKTree?如何序列化scala BKTree?
【发布时间】:2014-03-07 11:37:25
【问题描述】:

我确定我是否应该在这里问这个问题。我有一个扩展可序列化的scala类,但是当我尝试使用fileoutputstream保存类时,我不断收到NotSerializableException。

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。

【问题讨论】:

    标签: scala serialization


    【解决方案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 实现实际上可序列化的。

    【讨论】:

    • 我已经这样做了。这两个类都扩展了 Serializable。
    • 那么你应该看看Levenshtein.distance 的实现(或树用于dist 的任何函数)。它可能指的是一些不可序列化的对象。见docs.scala-lang.org/sips/pending/spores.html#serialization
    • 感谢您的评论。我明白了,但是有没有其他方法可以在 scala 中序列化这些类?因为我也尝试过不同的可序列化库。结果是相似的。
    • 您必须使您的函数可序列化或避免使其成为数据结构的一部分。
    猜你喜欢
    • 2019-11-03
    • 2022-12-14
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2010-10-19
    • 2019-02-03
    • 2012-09-17
    相关资源
    最近更新 更多