java gson序列化_java – Gson多态序列化
使用Gson 2.2.2我正在嘗試序列化POJO(行為)的數(shù)組列表.
我有一個(gè)適配器幾乎是我在網(wǎng)上看到的副本:
public class BehaviorAdapter implements JsonSerializer {
private static final String CLASSNAME = "CLASSNAME";
private static final String INSTANCE = "INSTANCE";
@Override
public JsonElement serialize(Behavior src, Type typeOfSrc,
JsonSerializationContext context) {
JsonObject retValue = new JsonObject();
String className = src.getClass().getCanonicalName();
retValue.addProperty(CLASSNAME, className);
JsonElement elem = context.serialize(src);
retValue.add(INSTANCE, elem);
return retValue;
}
}
我這樣注冊(cè):
GsonBuilder builder = new GsonBuilder();
builder.registerTypeHierarchyAdapter(Behavior.class, new BehaviorAdapter());
gson = builder.create();
然后,當(dāng)我嘗試序列化我的ArrayList時(shí):
String json2 = gson.toJson(behaviors);
我得到一個(gè)堆棧溢出.
它似乎在線:
JsonElement elem = context.serialize(src);
它啟動(dòng)一個(gè)遞歸循環(huán),一次又一次地通過我的序列化器.那么如何注冊(cè)它以便不會(huì)發(fā)生這種情況?我需要序列化列表并維護(hù)多態(tài)性.
解決方法:
However, you should never invoke it on the src object itself since that will cause an infinite loop (Gson will call your call-back method again).
我能想到的最簡(jiǎn)單的方法是創(chuàng)建一個(gè)沒有安裝處理程序的新Gson實(shí)例,然后通過它運(yùn)行實(shí)例.
作為最終運(yùn)行,您可以序列化List< Behavior>代替:
public class BehaviorListAdapter implements JsonSerializer> {
private static final String CLASSNAME = "CLASSNAME";
private static final String INSTANCE = "INSTANCE";
@Override
public JsonElement serialize(List src, Type typeOfSrc,
JsonSerializationContext context) {
JsonArray array = new JsonArray();
for (Behavior behavior : src) {
JsonObject behaviorJson = new JsonObject();
String className = behavior.getClass().getCanonicalName();
behaviorJson.addProperty(CLASSNAME, className);
JsonElement elem = context.serialize(behavior);
behaviorJson.add(INSTANCE, elem);
array.add(behaviorJson);
}
return array;
}
}
GsonBuilder builder = new GsonBuilder();
// use a TypeToken to make a Type instance for a parameterized type
builder.registerTypeAdapter(
(new TypeToken>() {}).getType(),
new BehaviorListAdapter());
gson = builder.create();
標(biāo)簽:java,gson
來源: https://codeday.me/bug/20190713/1450552.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的java gson序列化_java – Gson多态序列化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript历史、作用、三大组成
- 下一篇: mysql中的double类型_MySQ