gpt4 book ai didi

java - Gson 和通过继承序列化对象的 ArrayList

转载 作者:行者123 更新时间:2023-12-01 11:21:23 29 4
gpt4 key购买 nike

我对 Gson 和 Json 很陌生。我有简单的事件,我想在 Gson 的帮助下通过 Json 序列化。

注意:Kotlin 代码。

public abstract class Event() {
}

public class Move : Event() {
var from: Point? = null
var to: Point? = null
}

public class Fire : Event() {
var damage: Int = 0
var area: ArrayList<Point> = ArrayList(0)
}

public class Build : Event() {
var to: Point? = null
var type: String = ""
var owner: String = ""
}

我通过这种方式坚持这些:

val list: ArrayList<Event>() = ArrayList()
list.add(move)
list.add(fire)
val str = gson.toJson(events)

并且不坚持:

val type = object : TypeToken<ArrayList<Event>>(){}.getType()
val eventStr = obj.getString("events")
val events: ArrayList<Event> = gson.fromJson(eventStr, type)

我尝试过为 Event 类创建序列化器和反序列化器,并通过 registerTypeAdapter 注册它,并且我还尝试过 RuntimeTypeAdapterFactory,但两者都不会保留取消保留正确类型所需的信息。

例如,RuntimeTypeAdapterFactory 表示:“无法反序列化事件,因为它没有定义名为 type 的字段”

编辑:这是“适配器”的代码,它是……嗯,改编自另一篇 StackOverflow 帖子:

public class Adapter :
JsonSerializer<Event>,
JsonDeserializer<Event> {

final val CLASSNAME = "CLASSNAME"
final val INSTANCE = "INSTANCE"

override fun serialize(src: Event?, typeOfSrc: Type?, context: JsonSerializationContext?): JsonElement? {
val obj = JsonObject()
val className = (src as Event).javaClass.getCanonicalName()
obj.addProperty(CLASSNAME, className)
val elem = context!!.serialize(src)
obj.add(INSTANCE, elem)
return obj
}

override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): Event? {
val jsonObject = json!!.getAsJsonObject()
val prim = jsonObject.get(CLASSNAME)
val className = prim.getAsString()
val klass = Class.forName(className)
return context!!.deserialize(jsonObject.get(INSTANCE), klass)
}
}

此代码失败并出现 NullPointerException 在线:

val className = prim.getAsString()

最佳答案

你不能这样做。

您引用的示例并不针对您的情况。它仅适用于一种情况:如果您注册基本类型(而不是类型层次结构)并使用 gson.toJson(obj, javaClass<Event>()) 进行序列化。 。它永远不会适用于数组,除非您也为事件容器对象编写自定义序列化器

通常您需要另一种方法:使用 TypeAdapterFactory 和委托(delegate)适配器:GSON: serialize/deserialize object of class, that have registered type hierarchy adapter, using ReflectiveTypeAdapterFactory.Adapterhttps://code.google.com/p/google-gson/issues/detail?id=43#c15

我认为这种方法过于复杂,因此如果您的类型很少,最简单的解决方案是通过自定义序列化器逐个字段手动序列化这些类型,并忘记尝试委托(delegate)给默认值

关于java - Gson 和通过继承序列化对象的 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31185746/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com