7

我有一个 scala.collection.Set scalaSet : Set[Long]

我将如何将其转换为java.util.Set可序列化的。我尝试了以下代码,但得到了 java.io.notserializableexception: scala.collection.convert.wrappers$setWrapper

import scala.collection.JavaConversions._

Class MySerializableClass extends Serializable {

    // method to implement the Scala to Java operations on the given RDD
    def rddOps(dummyRDD: RDD[(Long, Set[Long])]) = {
        val dummyRDDWithJavaSet = dummyRDD.map( {
            case(key, value) => (key, scalaToJavaSetConverter(value))
    }

    // scala Set to Java Set Converters
    def scalaToJavaSetConverter(scalaSet: Set[Long]): java.util.Set[Long] = {
        val javaSet : java.util.Set[Long] = setAsJavaSet(scalaSet)
        javaSet
    }
}

在尝试序列化从 scala 转换为答案的 java map 时看到了线程 notserializable 异常,但该解决方案不适用于序列化

4

1 回答 1

4

的序列化问题scala.collection.JavaConvertions/JavaConverters是这些转换器是使用底层(scala/java)对象的包装器。它们只是一个包装器,因此要使其有效地序列化,它们必须保证底层结构是可序列化的。

在您的情况下,最简单的解决方案是在您的转换方法中实现结构副本:

// scala Set to Java Set Converters
def scalaToJavaSetConverter(scalaSet: Set[Long]): java.util.Set[Long] = {
    val javaSet = new java.util.HashSet[Long]()
    scalaSet.foreach(entry => javaSet.add(entry))
    javaSet
} 
于 2014-07-19T12:42:38.483 回答