Kotlin-无法序列化多态类。找不到序列化器

时间:2020-09-18 14:18:07

标签: kotlin kotlin-native kotlinx.serialization

我正在尝试使用kotlinx.serialization和kotlin / native来序列化多态类。我正在使用序列化指南中提供的示例:

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上运行时有效,但在linuxX64上使用kotlin本机编译并运行时,会引发错误:

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)
    ...

我是否错误地理解代码应该在两个平台上均正常工作? 如何使其在本机上工作?

3 个答案:

答案 0 :(得分:0)

我从github issues中发现了它的当前限制。

这是当前限制,应予以正确记录(cc @qwwdfsad)。请尝试format.encodeToString(PolymorphicSerializer(Project :: class),data)。如果是密封课程,它应该可以工作。如果没有,只需使用format.encodeToString(Project.serializer(),data)

答案 1 :(得分:0)

是的,这是当前限制,您可以签出Polymorphism documentation here并跟踪问题#1077

答案 2 :(得分:0)

您在定义为 SerializersModule 的子类时错过了为 OwnedProject 类声明序列化程序。

val module = SerializersModule {
        polymorphic(Project::class) {
            subclass(OwnedProject::class, OwnedProject.serializer()) // add here OwnedProject class serializer
        }
    }
相关问题