案例类层次结构的lift-json序列化

时间:2011-09-01 06:23:53

标签: scala serialization lift class-hierarchy

我有如下的层次结构:

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中有一些我不知道的东西吗?

3 个答案:

答案 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,默认行为是序列化与主要构造函数的参数对应的字段