案例对象的序列化策略

时间:2014-07-18 02:35:01

标签: scala serialization

说我有一个案例类声明如下:

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吗?

1 个答案:

答案 0 :(得分:0)

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

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