【问题标题】:case object's serialization strategycase对象的序列化策略
【发布时间】:2014-07-18 02:35:01
【问题描述】:

假设我有一个这样声明的案例类:

case object DoubleType {
  type JvmType = Double
}
case class DoubleLiteral(value: Double) {
  type fieldType = DoubleType.JvmType
  val dt = DoubleType
  val typeWidth = 8
  //methods here after
}

scala 在序列化DoubleLiteral(2.0) 时的行为是什么? 它只是序列化value吗?或者它也会序列化fieldTypedttypeWidth? 如果是这样,我应该将fieldTypedttypeWidth注释为@transient吗?

【问题讨论】:

    标签: scala serialization


    【解决方案1】:

    fieldType 这样的类型成员只存在于编译时,它们对对象的运行时结构或其序列化没有影响。这是因为 JVM 的类型擦除,适用于类型成员和类型参数。

    dttypewidth 之类的字段与 value 之类的构造函数中声明的字段一样,都是案例类实例的一部分。它们都将被序列化。您可以使用@transient 防止序列化,但对于dttypewidth 等静态值,最好完全阻止它们成为对象中的字段。最简单的方法是将每个字段声明为def。无论如何,所有访问都是通过 Scala 中的访问器方法完成的,因此没有性能成本。

    【讨论】:

    • 你能展示关于私人决赛的断言吗? scala> class Foo { private final val foo: Int = 5 ; def x = foo }scala> :javap -prv Foo?抱歉,我太懒了 ATM,无法尝试所有关键字组合。
    • @som-snytt 这个断言是错误的,我记错了。我已经编辑了更好的东西,但请看这里:stackoverflow.com/questions/13412386/…
    • 不要挑剔 impl 细节,但这会发出一个字段:class X { private final val x = 8 ; def y = x }。该字段未使用。
    • 你说得对,javap 清楚地显示了一个字段,尽管scalac -Xprint 说它不会创建一个字段。也许是 Java 互操作?
    • 这很有趣。 -Xprint 是什么意思?如果该字段已初始化,我会说互操作。
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2014-08-15
    • 2023-04-07
    • 1970-01-01
    • 2013-09-21
    相关资源
    最近更新 更多