2016-06-14 5 views
2

Iは、オブジェクトの下に同様に定義された2つの機能(それらの1部分である)を有する:スカラがなぜFunctionをシリアル化できるのですが、PartialFunctionをシリアル化できないのですか?

:それらは両方ともオプション(明確にシリアライズ)に包まれており、シリアライズは/デシリアライズ、そのうちの一つが故障している

val partialFn: scala.PartialFunction[String, Int] = 
    new AbstractPartialFunction[String, Int] { 

     override def isDefinedAt(v: String): Boolean = { 
     counter += 1 
     if (v == "abc") true 
     else false 
     } 

     override def applyOrElse[A1 <: String, B1 >: Int](v: A1, default: A1 => B1): B1 = { 
     counter += 1 
     if (v == "abc") { 
      v.length 
     } 
     else { 
      default(v) 
     } 
     } 
    } 

    val optionFn: (String) => Option[Int] = { 
    (v: String) => { 
     counter += 1 
     if (v == "abc") { 
     Some(v.length) 
     } 
     else { 
     None 
     } 
    } 
    } 

java.io.NotSerializableException: ***.extractors.ExtractorSuite$$anon$1 
Serialization stack: 
    - object not serializable (class: ***.extractors.ExtractorSuite$$anon$1, value: <function1>) 
    - field (class: scala.Some, name: x, type: class java.lang.Object) 
    - object (class scala.Some, Some(<function1>)) 
    at org.apache.spark.serializer.SerializationDebugger$.improveException(SerializationDebugger.scala:40) 
    at org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:47) 
    at org.apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:101) 
    at ***.tests.TestMixin$$anonfun$assertSerializable$1.apply(TestMixin.scala:61) 

... 

パーシャルファンクション&共通機能との大きな違いは何ですか?

答えて

2

Serializableを拡張せずにAbstractPartialFunctionを明示的に作成しているためです。 new AbstractFunction1[String, Int] { ... }と同じ操作を行うと、シリアル化もできなくなります。一方、無名関数構文を使用すると、コンパイラはSerializableを拡張するクラスを生成します。これには匿名の部分関数構文が含まれています:

scala> val x: PartialFunction[Int, Boolean] = { case 0 => true } 
x: PartialFunction[Int,Boolean] = <function1> 

scala> x.isInstanceOf[Serializable] 
res0: Boolean = true 
+0

私は、=>構文砂糖は自動的にシリアライズ可能なケースを生成しますが、=>砂糖はありませんか? REPL – tribbloid

+0

であなたの所見を確認させてください。どちらもありません。私はそれをより明確にするために答えを編集しました。 –

関連する問題