Kotlin - 无法序列化多态类。未找到序列化程序
Posted
技术标签:
【中文标题】Kotlin - 无法序列化多态类。未找到序列化程序【英文标题】:Kotlin - Cannot serialize polymorphic classes. No serializer found 【发布时间】:2021-01-05 11:55:09 【问题描述】:我正在尝试使用带有 kotlin/native 的 kotlinx.serialization
序列化多态类。我正在使用序列化指南中提供的示例:
val module = SerializersModule
polymorphic(Project::class)
subclass(OwnedProject::class)
val format = Json serializersModule = module
@Serializable
abstract class Project
abstract val name: String
@Serializable
@SerialName("owned")
class OwnedProject(override val name: String, val owner: String) : Project()
fun main()
val data: Project = OwnedProject("kotlinx.coroutines", "kotlin")
println(format.encodeToString(data))
此代码在使用 JVM 运行时有效,但在使用 kotlin native for linuxX64
编译和运行时会引发错误:
Uncaught Kotlin exception: kotlinx.serialization.SerializationException: Serializer for class 'Project' is not found. Mark the class as @Serializable or provide the serializer explicitly.
at kfun:kotlin.Throwable#<init>(kotlin.String?) (0x294767)
at kfun:kotlin.Exception#<init>(kotlin.String?) (0x28ea25)
at kfun:kotlin.RuntimeException#<init>(kotlin.String?) (0x28e725)
at kfun:kotlin.IllegalArgumentException#<init>(kotlin.String?) (0x28e925)
at kfun:kotlinx.serialization.SerializationException#<init>(kotlin.String?) (0x350185)
at kfun:kotlinx.serialization.internal#serializerNotRegistered@kotlin.reflect.KClass<*>()kotlin.Nothing (0x36fa0d)
at kfun:kotlinx.serialization#serializer@kotlin.reflect.KClass<0:0>()0§<kotlin.Any>kotlinx.serialization.KSerializer<0:0> (0x3505c8)
at kfun:kotlinx.serialization.serializer$serializerByKTypeImpl#internal (0x3512d2)
at kfun:kotlinx.serialization#serializer(kotlin.reflect.KType)kotlinx.serialization.KSerializer<kotlin.Any?> (0x3503c8)
...
我是否理解错误,代码应该在两个平台上都可以运行? 如何让它在原生上运行?
【问题讨论】:
【参考方案1】:我从github issues 发现它目前的限制。
这是一个当前的限制,应该正确记录(cc @qwwdfsad)。请尝试 format.encodeToString(PolymorphicSerializer(Project::class), data)。在密封类的情况下,它应该可以工作。如果没有,只需使用 format.encodeToString(Project.serializer(), data)
【讨论】:
【参考方案2】:是的,这是当前的限制,您可以查看Polymorphism documentation here 并跟踪问题#1077
【讨论】:
【参考方案3】:在定义为 SerializersModule 的子类时,您错过了为 OwnedProject 类声明序列化程序。
val module = SerializersModule
polymorphic(Project::class)
subclass(OwnedProject::class, OwnedProject.serializer()) // add here OwnedProject class serializer
【讨论】:
以上是关于Kotlin - 无法序列化多态类。未找到序列化程序的主要内容,如果未能解决你的问题,请参考以下文章
杰克逊的@JsonSubTypes仍然是多态反序列化所必需的吗?