Каков предпочтительный способ расширения сериализаторов в Kryo? Скажем, у меня есть класс B
, который расширяет A
, а B
имеет дополнительные поля, которые необходимо сериализовать. Очевидно, я не хочу снова писать всю логику сериализации для полей, унаследованных от A
.
В настоящее время я делаю это, создавая экземпляр ASerializer
и затем вызывая read
и write
напрямую, но это не работает. Я всегда получаю мусор обратно, как совершенно не связанные классы. Я не уверен, что это из-за моих составных сериализаторов или из-за других проблем.
class ASerializer : Serializer<A> {
fun write(kryo: Kryo, out: Output, obj: A) {
kryo.writeClassAndObject(out, obj.aField)
}
fun read(kryo: Kryo, in: Input, clazz: Class<out A>): A {
val aField = kryo.readClassAndObject(in)
return object : A {
val aField = aField
}
}
}
class BSerializer : Serializer<B> {
private val aSerializer = ASerializer()
fun write(kryo: Kryo, out: Output, obj: B) {
aSerializer.write(kryo, out, obj)
kryo.writeClassAndObject(out, obj.bField)
}
fun read(kryo: Kryo, in: Input, clazz: Class<out B>): B {
val a = aSerializer.read(kryo, in, clazz)
val bField = kryo.readClassAndObject(in)
return object : B, A {
val aField = a.aField
val bField = bField
}
}
}
Я тоже пробовал что-то вроде этого:
В BSerializer::write
:
kryo.writeObject(out, obj, ASerializer())
и BSerializer::read
:
val a = kryo.readObject(in, A::class.java, ASerializer())
Но значение, которое я читаю, часто null
, что не должно быть возможным.