我有如下的层次结构:
case class A(val a: Long, val b: String)
case class B(val c: String) extends A(a=3, b="a string")
我正在尝试使用lift-json序列化它以下:
val obj = B(c="another string")
val cameraJson = net.liftweb.json.Serialization.write(obj)
但我所看到的是它只序列化了B类中的属性而不是A中的属性。
我也试过了:
compact(render(decompose(obj)))
具有相同的结果
是什么给出的? Scala中有一些我不知道的东西吗?
答案 0 :(得分:8)
案例类继承是Scala的弃用功能。这应该适用于:
trait A { val a: Long; val b: String }
case class B(a: Long = 3, b: String = "a string", c: String) extends A
val obj = B(c="another string")
var ser = Serialization.write(obj)
Serialization.read[B](ser)
答案 1 :(得分:5)
案例类的经典提升JSON序列化基于构造函数参数列表(请参阅decompose implementation),而不是类属性。因此,您必须覆盖父特征中声明的所有字段(如@Joni答案中所示)或使用组合而不是继承。
例如:
case class A(a: Long, b: String)
case class B(c: String, a: A = A(a=3, b="a string"))
B(c="another string")
案例类构造函数中的BTW val
关键字是不必要的。每个构造函数arg的访问器是您通过将类声明为案例而免费获得的things之一。
答案 2 :(得分:3)
IMO仅序列化c似乎是正确的做法。序列化中出现的信息将是类型为B和C的值。信息类型为B表示a和b的值。它们是3和“一个字符串”,并且可以是其他任何内容,因此它们可以不需要写。
从粗略看一下the source code,默认行为是序列化与主要构造函数的参数对应的字段