说我有一个案例类声明如下:
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
吗?或者它还会序列化fieldType
,dt
和typeWidth
?
如果是,我应该将fieldType
,dt
和typeWidth
注释为@transient
吗?
答案 0 :(得分:0)
fieldType
之类的类型成员仅在编译时存在,它们对对象的运行时结构或其序列化没有影响。这是因为JVM的类型擦除,并且适用于类型成员和类型参数。
像dt
和typewidth
这样的字段与构造函数中声明的字段value
一样,也是案例类实例的一部分。它们都将被序列化。您可以使用@transient
阻止序列化,但对于dt
和typewidth
等静态值,最好防止它们成为对象中的字段。最简单的方法是将每个字段声明为def
。无论如何,所有访问都是通过Scala中的访问器方法完成的,因此没有性能成本。