Полиморфная сериализация kotlinx для сложной иерархии

С полиморфной сериализацией я хочу сериализовать классы 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 ответ

Для чего вы хотите... может быть, необязательно 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

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

Другие вопросы по тегам