Полиморфная сериализация kotlinx для сложной иерархии - PullRequest
0 голосов
/ 21 октября 2019

С полиморфной сериализацией я хочу сериализовать классы A, B1, B2. Я хочу получить следующую строку с классом B2

{"type":"type_2","baseField":"base_field_B","fieldB":true,"fieldB2":"field_B_2"}

Я использую иерархию вроде

interface BaseClass {
    val baseField: String
}

@Serializable
@SerialName("type_1")
data class A(
    override val baseField: String,
    val fieldA: Int
) : BaseClass

@Serializable
@SerialName("type_2")
abstract class B: BaseClass{
    abstract override val baseField: String
    abstract val fieldB: Boolean
}

@Serializable
data class B1(
    override val baseField: String,
    override val fieldB: Boolean,
    val fieldB1: Float
) : B()

@Serializable
data class B2(
    override val baseField: String,
    override val fieldB: Boolean,
    val fieldB2: String
) : B()

и выполняю сериализацию следующим образом

Json(context = SerializersModule {
    polymorphic(BaseClass::class) {
        A::class with A.serializer()
        B::class with B.serializer()
    }
}).stringify(
    PolymorphicSerializer(BaseClass::class),
    B1("base_field_B", true, "field_B_2")
)

В результатеЯ получаю kotlinx.serialization.SerializationException: class B2 (Kotlin reflection is not available) is not registered for polymorphic serialization in the scope of interface BaseClass (Kotlin reflection is not available)

Как правильно сериализовать данную структуру? Классы B1, B2 должны быть сериализованы с типом "type_2".

1 Ответ

0 голосов
/ 21 октября 2019

для того, что вы хотите ... возможно, необязательных полей String и Float будет достаточно для обхода объединения B, B1 и B2 в один класс?

@Serializable
@SerialName("type_2")
data class B(
    override val baseField: String,
    val fieldB: Boolean,
    val fieldB1: Float? = null,
    val fieldB2: String? = null
): BaseClass

Насколько Serializerобеспокоен тем, что вы не зарегистрировали B1 и B2, и вы не можете использовать один и тот же тип "type_2", поскольку десериализация будет невозможна, недостаточно разумно использовать наличие или отсутствие ключей для сопоставления с образцом правильного сериализатора, чтобы сериализовать и десериализовать до правильноготип, они должны иметь разные значения типа для каждого типа (A, B, B1, B2) и все должны быть сериализованы

...