如何使用 kotlinx 序列化使用 open val 序列化 kotlin 密封类

问题描述 投票:0回答:2
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

有没有办法在可序列化的密封类中拥有 open val,并且在覆盖它时可以正常工作?

kotlin serialization kotlinx.serialization
2个回答
12
投票

这是 Kotlin 问题 KT-38958。这似乎是构造函数属性要求的一个极端情况。

可以使用以下实现来解决,

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 序列化指南》中的 “设计可序列化层次结构”


0
投票
虽然

abstract

 属性是解决这个问题的好方法,但您也可以利用 
sealed interface
 这有助于以更简洁的方式解决这个问题

import kotlinx.serialization.Serializable @Serializable sealed interface Exercise { val id: String @Serializable data class Theory(override val id: String) : Exercise }
    
© www.soinside.com 2019 - 2024. All rights reserved.