Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复杂层次结构的多态kotlinx序列化_Kotlin_Serialization_Polymorphism_Kotlinx.serialization - Fatal编程技术网

复杂层次结构的多态kotlinx序列化

复杂层次结构的多态kotlinx序列化,kotlin,serialization,polymorphism,kotlinx.serialization,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 bas

对于多态序列化,我想序列化类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:类B2(Kotlin反射不可用)未注册为接口基类范围内的多态序列化(Kotlin反射不可用)


如何正确序列化给定结构?类B1、B2必须用类型“type_2”序列化。

以满足您的需要。。。也许可选的
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)上具有不同的类型值,并且所有类型都需要序列化

谢谢您的回答。但我认为将B1和B2与可选字段组合在一个对象中并不是最好的选择。我不想让同事在创建对象时出错(例如,B2带有空字段fieldB1和fieldB2,或者B2带有空字段B2和填充字段B1)。B2不应具有与B1相关的额外字段。在这种情况下,它们不能是同一类,也不能使用相同的
“type”:“type_2”
进行序列化。-另一种选择是使用合并表单进行序列化,然后提供扩展函数以转换为其他类型并返回。-还有一个选项,您可以滚动您自己的反序列化,该反序列化通过序列化程序要使用的对象上的键的存在以某种方式匹配,但这很困难