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
相关产品推荐
相关产品推荐

