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

Kotlin多态序列化异常:子类强转导致type字段缺失

为什么强转操作会导致kotlinx.serialization省略type字段?

这本质是Kotlin智能类型转换和kotlinx.serialization多态序列化机制共同作用的结果:

  1. kotlinx.serialization的多态序列化逻辑
    kotlinx.serialization对密封类的多态序列化,只有当你序列化**静态类型为父类(Parent)**的实例时,才会自动添加type字段(用来标识具体子类),并使用父类的多态序列化器处理。如果序列化的对象静态类型是子类(Child),则只会使用子类自身的普通序列化器,不会额外添加type字段——因为此时编译器已经明确知道类型,不需要多态标识。

  2. Kotlin智能类型转换的影响
    当你执行c as Child这个强转语句时,由于你的c本身就是Child实例(且密封类的特性让编译器可以确定这个强转不会失败),Kotlin编译器会触发智能类型转换:在这条语句之后,变量c的静态类型会被自动提升为Child。

    这就导致后续的Json.encodeToString(c)调用中,序列化器会根据c的静态类型(Child)选择普通序列化器,而不是Parent的多态序列化器,自然就不会生成type字段。反序列化时,因为缺失了type标识,多态序列化器无法判断应该实例化哪个子类,就会抛出“Polymorphic serializer was not found”异常。

  3. 验证与解决
    如果要避免这个问题,你可以手动指定序列化的类型为Parent,强制使用多态序列化器:

    Json.encodeToString(Parent.serializer(), c)
    

    或者避免让编译器触发智能类型转换,比如将强转的结果赋值给另一个变量:

    val childC = c as Child
    println("cc: $childC")
    Json.encodeToString(c) // 此时c的静态类型还是Parent
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:23:13