Лифт-JSON сериализация иерархии классов дел - PullRequest
3 голосов
/ 01 сентября 2011

У меня есть иерархия, подобная следующей:

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 есть что-то очевидное, чего мне не хватает?

Ответы [ 3 ]

8 голосов
/ 01 сентября 2011

наследование класса 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)
5 голосов
/ 01 сентября 2011

Классификация 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")

BTW valКлючевое слово в случае конструктора класса не требуется.Средства доступа для каждого аргумента конструктора arg - это одна из вещей , которую вы получаете бесплатно, объявив класс в качестве регистра.

3 голосов
/ 01 сентября 2011

Сериализация IMO только c кажется правильным решением.Информация, появляющаяся в сериализации, будет означать, что типом является B, а значение C. Значения a и b подразумеваются типом информации: B. Это 3 и «строка», и они могут быть ничем иным, поэтому они делаютне нужно писать.

Возможно, из-за слишком поверхностного взгляда на исходный код , по умолчанию используется для сериализации полей, которые соответствуют параметрам основного конструктора

...