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

标签 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 native 编译并运行时,它会抛出错误:

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#<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a2d1c7d0cbc3cecbd8c7d0eccdd6f0c7c5cbd1d6c7d0c7c6e2c9cdd6cecbcc8cd0c7c4cec7c1d68ce9e1cec3d1d1" rel="noreferrer noopener nofollow">[email protected]</a><*>(){}kotlin.Nothing (0x36fa0d)
    at kfun:kotlinx.serialization#<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3c4f594e555d505546594e7c575348505552124e595a50595f4812777f505d4f4f" rel="noreferrer noopener nofollow">[email protected]</a><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)
    ...

我是否理解错误,代码应该在两个平台上运行? 如何使其在 native 上运行?

最佳答案

正如我从 github issues 中发现的那样目前的限制。

It is a current limitation that should be properly documented (cc @qwwdfsad ). Please try format.encodeToString(PolymorphicSerializer(Project::class), data). In case of sealed classes, it should work. If it doesnt, simply use format.encodeToString(Project.serializer(), data)

关于Kotlin - 无法序列化多态类。未找到序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63957510/

相关文章:

android - 使用 Kotlin 在 Android 中实现 WebSocket

java - 升级到 Gradle 包装器到 7.0.2 和 JDK 11 后,Android 版本构建失败

arrays - 如何使用扩展运算符将 Array<Int> 传递给 vararg Int 函数?

kotlin - Kodein + Ktor = 卡住 kotlin.collections.HashMap 的突变尝试 - 为什么?

android - 在 Kotlin 中更改列表或数组中项目的数据类型

arrays - Kotlin中带有ByteArray的数据类

java - 为什么从 ViewModel 进行调用时,Retrofit enqueue 不起作用?

kotlin - 如何在 Kotlin/Native 中构建 kotlinx.coroutines(测试版本 0.23.4-native-1)

android - NoClassDefFoundError kotlinx 序列化

json - 如何使用动态对象反序列化JSON?