【发布时间】:2015-07-02 13:17:55
【问题描述】:
我对 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-class 创建一个序列化器和反序列化器,并通过 registerTypeAdapter 注册它,我还尝试了 RuntimeTypeAdapterFactory,但两者都不会保留取消保留正确类型所需的信息。
例如,RuntimeTypeAdapterFactory 说: “无法反序列化事件,因为它没有定义名为类型的字段”
编辑:这是“适配器”的代码,它是......好吧,改编自另一个 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()
【问题讨论】:
-
我想创建一个自定义反序列化器是要走的路。你能把你写的代码贴出来吗?
-
@RiccardoCiovati 嗨,我添加了一些代码。序列化事件没有任何问题..但是,就像我说的,当我反序列化它们时,信息根本不存在(我打印了一个反序列化的移动事件,它只有“来自”的点数据和“to”)(我也有一个 Point-class 的自定义序列化程序)
-
傻我。我根本没有为子类注册类型适配器,而只是为事件类注册,这就是问题所在。但是,现在我在线上有一个 StackOverflowError:
val elem = context!!.serialize(src)。有什么想法可能导致这种情况吗? -
我怀疑这是由于
(src as Event)。但我不确定如何解决它。 -
你有堆栈溢出,因为你调用 ????在已经序列化的 src 对象上序列化。你只需调用 ????你的代码递归