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

jer*_*202 9 json kotlin json-deserialization kotlin-native kotlinx.serialization

我想在 Kotlin 多平台项目中使用 kotlinx.serialization 解码包含多态类结构中的对象列表的 json 字符串,但它仅适用于 JVM,不适用于 Native。这是一个最小的可重现示例:

\n
@Serializable\nabstract class Project {\n    abstract val name: String\n}\n\n@Serializable\n@SerialName("BasicProject")\ndata class BasicProject(override val name: String): Project()\n\n@Serializable\n@SerialName("OwnedProject")\ndata class OwnedProject(override val name: String, val owner: String) : Project()\n\nfun main() {\n    val data = Json.decodeFromString<List<Project>>("""\n        [\n            {"type":"BasicProject","name":"example"},\n            {"type":"OwnedProject","name":"kotlinx.serialization","owner":"kotlin"} \n        ]\n    """))\n}  \n
Run Code Online (Sandbox Code Playgroud)\n

这适用于 JVM,但在 Native 上会引发以下异常:

\n
kotlinx.serialization.SerializationException: Serializer for class \xe2\x80\x98Project\xe2\x80\x99 is not found.\nMark the class as @Serializable or provide the serializer explicitly.\nOn Kotlin/Native explicitly declared serializer should be used for interfaces and enums without @Serializable annotation.message\n
Run Code Online (Sandbox Code Playgroud)\n

这个问题之前已经在编码的背景下讨论过,并且已经建议了一些解决方法,例如here,但我的问题是解码。有解决方法吗,还是我只需实现自己的 json 解析器?

\n

Мих*_*аль 10

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

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"} 
        ]
        """
    )
}
Run Code Online (Sandbox Code Playgroud)