【发布时间】:2019-09-27 12:52:03
【问题描述】:
我不确定这是限制、错误还是 GSON 使用不当。我需要有一个 Kotlin 对象的层次结构(具有各种子类型的父对象),并且我需要使用 GSON 对它们进行反序列化。反序列化的对象具有正确的子类型但其字段 enumField 实际上为 null。
首先我认为这是因为该字段被传递给“super”构造函数,但后来我发现“super”适用于字符串,只是枚举被破坏了。
看这个例子:
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.typeadapters.RuntimeTypeAdapterFactory
open class Parent(val stringField: String,
val enumField: EnumField) {
enum class EnumField {
SUBTYPE1,
SUBTYPE2,
SUBTYPE3
}
}
class Subtype1() : Parent("s1", EnumField.SUBTYPE1)
class Subtype2(stringField: String) : Parent(stringField, EnumField.SUBTYPE2)
class Subtype3(stringField: String, type: EnumField) : Parent(stringField, type)
val subtypeRAF = RuntimeTypeAdapterFactory.of(Parent::class.java, "enumField")
.registerSubtype(Subtype1::class.java, Parent.EnumField.SUBTYPE1.name)
.registerSubtype(Subtype2::class.java, Parent.EnumField.SUBTYPE2.name)
.registerSubtype(Subtype3::class.java, Parent.EnumField.SUBTYPE3.name)
fun main() {
val gson = GsonBuilder()
.registerTypeAdapterFactory(subtypeRAF)
.create()
serializeAndDeserialize(gson, Subtype1()) // this works (but not suitable)
serializeAndDeserialize(gson, Subtype2("s2")) // broken
serializeAndDeserialize(gson, Subtype3("s3", Parent.EnumField.SUBTYPE3)) // broken
}
private fun serializeAndDeserialize(gson: Gson, obj: Parent) {
println("-----------------------------------------")
val json = gson.toJson(obj)
println(json)
val obj = gson.fromJson(json, Parent::class.java)
println("stringField=${obj.stringField}, enumField=${obj.enumField}")
}
任何想法如何实现enumField的反序列化?
(deps:com.google.code.gson:gson:2.8.5,org.danilopianini:gson-extras:0.2.1)
P.S.:请注意,我必须使用 RuntimeAdapterFactory,因为我有具有不同字段集的子类型(我在示例中没有这样做,因此更容易理解)。
【问题讨论】:
-
你能发布错误日志吗?
标签: kotlin gson deserialization