3

我有一个如下的层次结构:

case class A(val a: Long, val b: String)

case class B(val c: String) extends A(a=3, b="a string")

我正在尝试使用 lift-json ala 对其进行序列化,如下所示:

val obj = B(c="another string")
val cameraJson = net.liftweb.json.Serialization.write(obj)

但我看到的是它只序列化 B 类中的属性,而不是 A 类中的属性。

我也试过:

compact(render(decompose(obj)))

结果相同

是什么赋予了?Scala 中是否有我遗漏的明显内容?

4

3 回答 3

8

case 类继承是 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)
于 2011-09-01T06:44:13.240 回答
5

案例类的经典提升 JSON 序列化基于构造函数参数列表(请参阅分解实现),而不是类属性。因此,您必须覆盖父特征中声明的所有字段(如@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")

BTWval关键字以防类构造函数是不必要的。每个构造函数 arg 的访问器是您通过将类声明为案例而免费获得的东西之一。

于 2011-09-01T06:58:25.920 回答
3

IMO 仅序列化 c 似乎是正确的做法。序列化中出现的信息将是类型是B,值是C。信息类型隐含a和b的值是B。它们是3和“a string”,不能是别的,所以他们做不需要写。

从可能过于粗略地看一下源代码,默认行为是序列化与主构造函数的参数相对应的字段。

于 2011-09-01T07:01:24.270 回答