Kryo: Предпочитаемый способ расширения сериализаторов? - PullRequest
0 голосов
/ 16 января 2019

Каков предпочтительный способ расширения сериализаторов в 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, что не должно быть возможным.

...