kotlinx.serialization序列化实现双密封接口类抛未注册异常问题咨询
修正方案
- 为两个sealed接口添加多态序列化必要注解
sealed接口作为多态序列化的根类,必须显式标记@Polymorphic和@Serializable:
@Polymorphic @Serializable sealed interface MyClass { // 原有属性定义 } @Polymorphic @Serializable sealed interface MyClassBuilder { // 原有方法定义 }
- 补全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() } } }
- 调用序列化方法时显式指定父类泛型
如果调用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
相关产品推荐
相关产品推荐

