用于复杂层次结构的多态Kotlinx序列化

时间:2019-10-21 11:05:47

标签: kotlin serialization polymorphism kotlinx.serialization

对于多态序列化,我想序列化类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 :(得分:0)

对于您想要的内容...也许可选的StringFloat字段足以将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)上具有不同的类型值,并且都需要序列化