Я читаю документацию для µPickle и ищу в Интернете, но я не смог найти упоминаний об одной функции, которая является довольно простой, и я помню, как она была документирована, возможно, для всех библиотек сериализации, которые я использовалдо (Джексон, Колючка ...): полиморфные типы.Единственная документация, которую я нашел, касается запечатанных черт / классов.Рассмотрим следующий код:
import upickle.default._
trait Base
object Base{
implicit val rw: ReadWriter[Base] = ReadWriter.merge(C1.rw, C2.rw)
}
object C1 {
implicit val rw: ReadWriter[C1] = macroRW
}
object C2 {
implicit val rw: ReadWriter[C2] = macroRW
}
case class C1(x: Int) extends Base
case class C2(s: String) extends Base
object Main extends App {
val c1: Base = new C1(0)
val c2: Base = new C2("X")
val c1String = write(c1)
val c2String = write(c2)
println("c1 " + c1String)
println("c2 " + c2String)
}
Этот код работал бы, если бы я изменил trait Base
на sealed trait Base
.Я согласен с требованием перечислить все производные классы в сериализаторе, это то же самое, что и в других упомянутых мной библиотеках, но не всегда возможно или желательно иметь несколько больших классов в одном исходном файле, чтобы база моглабыть запечатанным.Как можно сериализовать полиморфные типы с помощью uPickle, если база не запечатана?