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

kotlinx.serialization序列化实现双密封接口类抛未注册异常问题咨询

修正方案

  1. 为两个sealed接口添加多态序列化必要注解
    sealed接口作为多态序列化的根类,必须显式标记@Polymorphic和@Serializable:
@Polymorphic
@Serializable
sealed interface MyClass {
    // 原有属性定义
}

@Polymorphic
@Serializable
sealed interface MyClassBuilder {
    // 原有方法定义
}
  1. 补全SerializersModule中的子类注册
    你遗漏了DefaultMyClass这个MyClass的子类注册,必须补上:
val module = SerializersModule {
  polymorphic(MyClass::class) {
        subclass(DefaultMyClass::class, DefaultMyClass.serializer()) // 新增该注册项
        subclass(MyClassFromBuilder::class, MyClassFromBuilder.serializer())
        default { MyClassFromBuilder.serializer() }
    }

  polymorphic(MyClassBuilder::class) {
         subclass(MyClassFromBuilder::class, MyClassFromBuilder.serializer())
         default { MyClassFromBuilder.serializer() }
     }
}
  1. 调用序列化方法时显式指定父类泛型
    如果调用encodeToMessage时让泛型自动推断为具体子类类型,不会触发多态序列化逻辑,需要显式指定泛型为父接口类型:
// 正确写法,MyClass实例序列化
ConfiguredProtoBuf.encodeToMessage<MyClass>(yourInstance)
// MyClassBuilder实例序列化
ConfiguredProtoBuf.encodeToMessage<MyClassBuilder>(yourBuilderInstance)

额外检查点

  • 你报错信息里提到的类是Payload和PayloadFromBuilder,和你提供的示例代码类名不一致,请确认你实际代码中注册多态的根类是Payload::class,不要写错类名。
  • 不要使用默认的ProtoBuf实例,必须用你配置了serializersModule的ConfiguredProtoBuf实例做序列化操作。
  • 如果DefaultMyClass的private可见性导致序列化框架无法访问,可以将可见性调整为internal,或手动传入其序列化器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:45:02