如何使用Kotlinx序列化使用Open Val序列化Kotlin密封类

时间:2020-07-30 12:22:45

标签: kotlin serialization kotlinx.serialization

import kotlinx.serialization.Serializable

@Serializable
sealed class Exercise(open val id: String) {

    @Serializable
    data class Theory(override val id: String) : Exercise(id)
}

我的代码中有这种密封的类,编译器对我说: Serializable class has duplicate serial name of property 'id', either in the class itself or its supertypes

有没有办法在可序列化的密封类中打开val,该类在覆盖它时可以正常工作?

1 个答案:

答案 0 :(得分:2)

这是Kotlin issue KT-38958。这似乎是Constructor properties requirement的一个极端案例。

可以通过以下实现方式解决

import kotlinx.serialization.*
import kotlinx.serialization.json.Json

@Serializable
sealed class Exercise {
    abstract val id: String

    @Serializable
    data class Theory(override val id: String) : Exercise()
}

fun main() {
    val t1 = Exercise.Theory("t1")
    val t1Json = Json.encodeToString(t1)
    println(t1Json)
    println(Json.decodeFromString<Exercise.Theory>(t1Json).toString())
}

它将输出:

{"id":"t1"}
Theory(id=t1)

有关详细信息,请参阅《 Kotlin序列化指南》中的"Designing serializable hierarchy"