我想使用Kotlin多平台项目中的kotlinx.serialization来解码包含多态类结构中对象列表的json字符串,但是它只在JVM上工作,而不是在本机上工作。下面是一个最低可重现性的例子:
@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上有效,但在本机上引发以下异常:
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解析器?
发布于 2021-03-10 11:49:08
您需要显式地传递相互尊重的序列化程序和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"}
]
"""
)
}https://stackoverflow.com/questions/66554036
复制相似问题