首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Kotlin/Native中用kotlinx.serialization进行多态反序列化

在Kotlin/Native中用kotlinx.serialization进行多态反序列化
EN

Stack Overflow用户
提问于 2021-03-09 20:08:04
回答 1查看 3.8K关注 0票数 5

我想使用Kotlin多平台项目中的kotlinx.serialization来解码包含多态类结构中对象列表的json字符串,但是它只在JVM上工作,而不是在本机上工作。下面是一个最低可重现性的例子:

代码语言:javascript
复制
@Serializable
abstract class Project {
    abstract val name: String
}

@Serializable
@SerialName("BasicProject")
data class BasicProject(override val name: String): Project()

@Serializable
@SerialName("OwnedProject")
data class OwnedProject(override val name: String, val owner: String) : Project()

fun main() {
    val data = Json.decodeFromString<List<Project>>("""
        [
            {"type":"BasicProject","name":"example"},
            {"type":"OwnedProject","name":"kotlinx.serialization","owner":"kotlin"} 
        ]
    """))
}  

这在JVM上有效,但在本机上引发以下异常:

代码语言:javascript
复制
kotlinx.serialization.SerializationException: Serializer for class ‘Project’ is not found.
Mark the class as @Serializable or provide the serializer explicitly.
On Kotlin/Native explicitly declared serializer should be used for interfaces and enums without @Serializable annotation.message

这个问题以前曾在编码的背景下讨论过,并提出了一些解决办法,例如here,但我的问题是解码。有解决办法吗?还是我只需要实现我自己的json解析器?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-10 11:49:08

您需要显式地传递相互尊重的序列化程序和serializersModule

代码语言:javascript
复制
object ListOfProjectSerializer : KSerializer<List<Project>> by ListSerializer(Project.serializer())

val module = SerializersModule {
    polymorphic(Project::class) {
        subclass(BasicProject::class)
        subclass(OwnedProject::class)
    }
}

fun main() {
    val data = Json { serializersModule = module }.decodeFromString(
        ListOfProjectSerializer,
        """
        [
            {"type":"BasicProject","name":"example"},
            {"type":"OwnedProject","name":"kotlinx.serialization","owner":"kotlin"} 
        ]
        """
    )
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66554036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档