首页 > 解决方案 > 密封接口的序列化器 (kotlinx.serialization)

问题描述

我正在尝试序列化实现两个密封接口的基类。我尝试了多种方法,但我总是得到错误:

引起:kotlinx.serialization.SerializationException:类“PayloadFromBuilder”未在“Payload”范围内注册多态序列化。将基类标记为“密封”或显式注册序列化程序。

我主要关注本指南Kotlinx/polymorphism并在此处检查了一些类似的问题。

我的代码:

sealed inteface MyClass {
dataetc
}

@Serializable
private class DefaultMyClass(dataetc): MyClass

fun MyClass(dataetc): MyClass = DefaultMyClass


Sealed interface MyClassBuilder {
    fun dataetc(value: ByteArray)
    fun dataetc(value: ByteArray)
    fun dataetc(value: ByteArray?)
}

@PublishedApi
@Serializable
@SerialName("payload")
internal class MyClassFromBuilder: MyClassBuilder, MyClass {

}

//Serialization
val module = SerializersModule {
  polymorphic(MyClass::class) {
        subclass(MyClassFromBuilder::class, MyClassFromBuilder.serializer())
        default { MyClassFromBuilder.serializer() }
    }

  polymorphic(MyClassBuilder::class) {
         subclass(MyClassFromBuilder::class, MyClassFromBuilder.serializer())
         default { MyClassFromBuilder.serializer() }
     }

}


val ConfiguredProtoBuf = ProtoBuf { serializersModule = module }


@ExperimentalSerializationApi
internal inline fun <reified T> ProtoBuf.encodeToMessage(value: T): Message =
    Message(encodeToByteArray(value))


从我所看到的情况来看,我认为我非常接近解决方案,但我缺少一些东西,因为我的示例非常通用,如果您需要更多信息,请告诉我,提前谢谢您。

注意:在我的几次尝试中,我尝试用 @Polymorphic 注释两个密封的接口,但我不确定它是否改变了任何东西。

注意 2:当我调用 encodeToMessage 时,我的代码会中断

标签: kotlinserialization

解决方案


所以我搞砸了很长时间,结果当我调用我的 encodeToMessage 时我没有使用我的 ConfiguredProtoBuf


推荐阅读