2016-05-15 5 views
3

Рассмотрим этот крошечный фрагмент:Boolean не является Serializable?

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 

См http://www.scala-lang.org/api/2.11.8/#scala.Serializable информации о scala.Serializable, которые, кажется, указывают на какие-то кроссплатформенных сериализации между виртуальной машины Java и .NET.

+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 (не Scala) бинарной структуры сериализации. Следовательно, достаточно, чтобы класс расширял 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

Смежные вопросы