You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin嵌套密封类序列化:抽象属性@SerialName复用问题

解决密封类嵌套序列化时继承@SerialName的问题

问题根源

你的代码里基类的abstractProperty缺少abstract修饰符,这不仅会导致编译失败,还会让序列化器把基类未初始化的属性和子类override的属性当成两个独立字段处理,最终输出重复的键名。

解决方案

修正基类属性声明,确保子类仅继承基类的序列化配置,无需重复添加注解:

@Serializable
sealed class Base {
    @SerialName("concrete_property")
    val concreteProperty: String = "concrete property of base"
    
    // 修正:添加abstract修饰,明确这是抽象属性
    @SerialName("abstract_property")
    abstract val abstractProperty: String

    @Serializable
    @SerialName("subclass")
    data class Subclass(
        // 仅用override val实现,无需额外序列化注解
        override val abstractProperty: String,
        @SerialName("subclass_concrete_property")
        val subclassConcreteProperty: String
    ) : Base()

    @Serializable
    @SerialName("subclass2")
    data class Subclass2(
        override val abstractProperty: String,
        @SerialName("subclass_other_concrete_property")
        val subclassOtherConcreteProperty: String
    ) : Base()
}

原理说明

Kotlinx Serialization会自动继承基类抽象属性的@SerialName配置,只要子类通过override val正确实现该属性,序列化时就只会使用基类定义的abstract_property作为键名,不会额外输出子类的属性原名。

内容的提问来源于stack exchange,提问作者brzi_gonzales

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:06:15