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

Kotlinx Serialization多层多态类序列化模块配置求助

解决Kotlinx Serialization多层继承多态的配置问题

你当前的错误源于SerializersModule的嵌套配置不符合Kotlinx Serialization的多态处理逻辑:当使用PolymorphicSerializer(Project::class)反序列化时,序列化器只会在直接注册到Project::class下的子类中查找判别器,不会递归遍历中间父类(如OwnedProject)的多态配置,因此无法识别owned_owned这个判别器。

正确配置方案

将所有需要被多态识别的子类(包括OwnedProject和OwnedOwnedProject)直接注册到顶层父类Project::class的多态配置中,不需要嵌套:

val module = SerializersModule {
    polymorphic(Project::class) {
        subclass(OwnedProject::class)
        subclass(OwnedOwnedProject::class)
    }
}

完整可运行代码

import kotlinx.serialization.*
import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.polymorphic

@Serializable
open class Project(val name: String)

@Serializable
@SerialName("owned")
open class OwnedProject(val owner: String) : Project("kotlin")

@Serializable
@SerialName("owned_owned")
class OwnedOwnedProject(val ownerOwner: String) : OwnedProject("kotlinx.coroutines")

val module = SerializersModule {
    polymorphic(Project::class) {
        subclass(OwnedProject::class)
        subclass(OwnedOwnedProject::class)
    }
}

val format = Json { serializersModule = module }

fun main() {
    val str = "{\"type\":\"owned_owned\",\"name\":\"kotlin\",\"owner\":\"kotlinx.coroutines\",\"ownerOwner\":\"kotlinx.coroutines.launch\"}"
    val obj = format.decodeFromString(PolymorphicSerializer(Project::class), str)
    println(obj) // 输出:OwnedOwnedProject(name=kotlin, owner=kotlinx.coroutines, ownerOwner=kotlinx.coroutines.launch)
}

关键说明

  • Kotlinx Serialization的多态机制基于顶层父类实现,所有需要被反序列化识别的子类必须直接关联到顶层父类的多态序列化器,无论它们继承自哪个中间类。
  • 确保每个子类的@SerialName与JSON中的type字段值完全匹配(大小写敏感)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:48:26