json - Kotlin 密封接口序列化
问题描述
Kotlin 密封接口序列化似乎被破坏了,除非使用显式注册的序列化模块。我错过了什么吗?
import kotlinx.serialization.*
import kotlinx.serialization.json.Json
import kotlin.test.Test
sealed interface iFoo {
@Serializable
@SerialName("a")
class A() : iFoo//Foo(),
}
class EventTest {
@Test
fun testKotlinLang() {
// // this works
// val json = Json { serializersModule = SerializersModule {
// polymorphic(iFoo::class) {
// subclass(iFoo.A::class, iFoo.A.serializer())
// } } }
val json = Json
val a = iFoo.A() as iFoo
val s = json.encodeToString(a)
val a1: iFoo = json.decodeFromString(s)
}
}
Class 'A' is not registered for polymorphic serialization in the scope of 'iFoo'.
Mark the base class as 'sealed' or register the serializer explicitly.
kotlinx.serialization.SerializationException: Class 'A' is not registered for polymorphic serialization in the scope of 'iFoo'.
Mark the base class as 'sealed' or register the serializer explicitly.
at kotlinx.serialization.internal.AbstractPolymorphicSerializerKt.throwSubtypeNotRegistered(AbstractPolymorphicSerializer.kt:102)
at kotlinx.serialization.internal.AbstractPolymorphicSerializerKt.throwSubtypeNotRegistered(AbstractPolymorphicSerializer.kt:113)
at kotlinx.serialization.PolymorphicSerializerKt.findPolymorphicSerializer(PolymorphicSerializer.kt:109)
at kotlinx.serialization.json.internal.StreamingJsonEncoder.encodeSerializableValue(StreamingJsonEncoder.kt:224)
at kotlinx.serialization.json.Json.encodeToString(Json.kt:85)
at io.almer.EventTest.testKotlinLang(EventTest.kt:64)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
..............
请注意,我使用的是多平台模式,但 JVM 运行失败。
解决方案
推荐阅读
- php - 从价值=预定的行中获取数据;在使用 PHP 加密的 Sql 数据库中
- java - 如何使用 Weblogic Eclipse 服务器在本地机器上运行 Eclipse 项目?
- mysql - 如何在 mysql 中正确执行异常处理程序以收集错误数据?
- c++ - 如何使用迭代器遍历向量并访问元素值?
- php - 在 Symfony 中通过路由调用方法之前立即调用另一个方法
- python - 如何从 z3py 中的 Z3 Solver 对象中获取现有约束?
- javascript - 制作多个可访问的模式对话框
- amazon-web-services - 如果遇到任何错误或调用失败,如何配置多个 Lambda 函数以发布到 SNS 主题?
- javascript - 使用 axios 和 axios cancel token 取消之前的 post 请求
- php - fwrite 返回(资源暂时不可用)