2016-05-15 14 views
3

この小さなスニペット考えてみましょう:動機は、クラスのささやかな範囲をサポートするために..です驚きのビットであるブール値はシリアライズ可能ではありませんか?

scala> val u = true.asInstanceOf[Serializable] 
java.lang.ClassCastException: java.lang.Boolean cannot be cast to scala.Serializable 

まあを - 両方のプリミティブとカスタムクラス(が明示的にを行う `Serializableを拡張) 。

したがって、これらのプリミティブの自動シリアル化を処理する方法は何ですか?

答えて

6

java.lang.Booleanのがscala.Serializableではありません。しかしjava.io.Serializableの次のとおりです。

scala> val u = true.asInstanceOf[java.io.Serializable] 
u: java.io.Serializable = true 

は、JVMと.NETの間のクロスプラットフォームのシリアル化のいくつかの種類を示しているように見えるの情報についてscala.Serializableためhttp://www.scala-lang.org/api/2.11.8/#scala.Serializableを参照してください。

+0

有用な洞察のように聞こえます。私は今それを調べている。 – javadba

+1

明らかに、シリアライズ可能なintellijが私にインポートするために提供する*にもっと注意を払う必要があります。スカラーのバージョンは、めったに必要なものではありません。 – javadba

1

あなたはObjectOutputStream/ObjectInputStreamは/デシリアライズオブジェクトをシリアル化するために使用することができます。

import java.io.{ObjectOutputStream, FileOutputStream, ObjectInputStream, FileInputStream} 

object Test extends App { 

    val oos = new ObjectOutputStream(new FileOutputStream("bool.obj")) 
    oos.writeObject(true) 
    oos.close() 

    val ois = new ObjectInputStream(new FileInputStream("bool.obj")) 
    val obj = ois.readObject() 
    println(obj) // Prints: true 
    ois.close() 

} 

これらのストリームクラスは、Java(ないScalaの)バイナリシリアルフレームワークの一部です。その結果、クラスではjava.io.Serializableを直列化可能に拡張するだけで十分です。プリミティブbooleanjava.io.Serializableと考えられている:

true.isInstanceOf[scala.Serializable] // false 
true.isInstanceOf[java.io.Serializable] // true 
+0

はい私はそれがjava.io.Serializableではなくscala.Serializableであったことに気付きませんでした。 – javadba