2016-05-15 88 views
3

考慮這個小片段:布爾是不是可序列化?

scala> val u = true.asInstanceOf[Serializable] 
java.lang.ClassCastException: java.lang.Boolean cannot be cast to scala.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.Serializablehttp://www.scala-lang.org/api/2.11.8/#scala.Serializable

+0

聽起來像是一個有用的見解。我現在正在研究它。 – javadba

+1

顯然我需要更多的關注*哪些* Serializable intellij提供爲我導入。 scala版本很少(如果有的話)是所需的版本。 – 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(不斯卡拉)二進制序列化框架的一部分。因此,課程將java.io.Serializable擴展爲可序列化就足夠了。 boolean原語被認爲是java.io.Serializable

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

是的我沒有注意到它是scala.Serializable而不是java.io.Serializable。 – javadba