【问题标题】:Boolean is not Serializable?布尔值不可序列化?
【发布时间】:2016-09-11 13:35:13
【问题描述】:

考虑一下这个小sn-p:

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

嗯,这有点令人惊讶。其动机是支持适度范围的类 - 原始类和自定义类(确实明确地“扩展了可序列化”)。

那么如何处理这些原语的自动序列化呢?

【问题讨论】:

    标签: scala serializable


    【解决方案1】:

    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 的信息,这似乎表明 JVM 和 .NET 之间存在某种跨平台序列化。

    【讨论】:

    • 听起来很有用。我现在正在调查。
    • 显然我需要更多地关注哪些 Serializable intellij 为我提供了导入功能。 scala 版本很少(如果有的话)是理想的版本。
    【解决方案2】:

    您可以使用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
    

    【讨论】:

    • 是的,我没有注意到它是 scala.Serializable 而不是 java.io.Serializable。
    猜你喜欢
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 2020-05-20
    相关资源
    最近更新 更多