2011-09-01 23 views
3

我有這樣一個層次結構如下:情況下類層次的提升JSON序列

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

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

,我試圖序列使用升降JSON ALA以下它:

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

但我看到的是它只是序列化B類中的屬性而不是A中的屬性。

我也試過:

compact(render(decompose(obj))) 

與結果相同

什麼給? Scala中有什麼顯而易見的東西我失蹤了?

回答

8

案例類繼承是Scala的棄用功能。這應該例如工作:爲case類

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) 
+4

A小調精度的參數字段:這是個別情況類繼承被棄用。您仍然可以使用標準類擴展案例類。 – Nicolas

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之一。

+0

在類的情況下,所有構造函數參數都默認爲val是更有幫助的。 – Caoilte

3

國際海事組織序列化只有C似乎是正確的事情。在序列化中出現的信息將是類型是B和C的值。信息類型隱含的a和b的值是B.它們是3和「一個字符串」,並且可以不是別的,所以它們是不需要寫入。

從也許是太粗略一看the source code,默認行爲是序列對應於主構造

相關問題