1 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊
我真的不知道在沒有手動(dòng)或hacky的情況下使用gson執(zhí)行此操作的方法。這太大了,無法作為評(píng)論發(fā)表,因此我將其留在這里作為答案,以幫助您解決問題。
首先,您會(huì)遇到堆棧溢出,因?yàn)槟谡{(diào)用context.deserialize相同的參數(shù),這些參數(shù)觸發(fā)gson調(diào)用相同的反序列化器,它將再次調(diào)用context.deserialize,依此類推,直到堆棧溢出。
序列化時(shí)你會(huì)遇到同樣的問題,因?yàn)槟阋仓皇窃谧鯿ontext.serialize.
為避免這種情況,您需要避免gson遞歸調(diào)用序列化器/反序列化器的方法。這很容易通過創(chuàng)建另一個(gè)gson沒有適配器的實(shí)例來實(shí)現(xiàn):
public class PetAdapter
implements JsonSerializer<Pet>, JsonDeserializer<Pet> {
private final Gson gson = new Gson();
@Override
public Pet deserialize(JsonElement jsonElement, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
EntityType entityType = EntityType.valueOf(jsonElement.getAsJsonObject().get("entityType").getAsString());
switch (entityType) {
case IRON_GOLEM:
return gson.fromJson(jsonElement, EcoPet.class);
case WOLF:
return gson.fromJson(jsonElement, BoostPet.class);
case MAGMA_CUBE:
return gson.fromJson(jsonElement, CombatPet.class);
default:
throw new JsonParseException("Invalid PetType");
}
}
@Override
public JsonElement serialize(Pet src, Type typeOfSrc, JsonSerializationContext context) {
return gson.toJson(src);
}
}
這有效,但前提是您的Pet實(shí)現(xiàn)不依賴于其他自定義序列化器/反序列化器。所以你可以想象這很hacky。
另一種方法是手動(dòng)反序列化。這意味著您必須通過 json 元素并讀取屬性,就像您正在閱讀entityType和手動(dòng)構(gòu)建您的對(duì)象一樣。
非常相似,我想(我沒有檢查這個(gè)),您可以首先context將每個(gè)寵物反序列化為一個(gè)Map對(duì)象,并讓每個(gè)寵物實(shí)現(xiàn)一個(gè)靜態(tài)方法,該方法從該地圖創(chuàng)建特定寵物的實(shí)例。就像是:
public class IronGolem extends Pet {
public static IronGolem from(Map<String, Object> deserializedPet) {
// here check the map for each thing you need
return new IronGolem(/*pass in every attribute*/);
}
}
希望這可以幫助。
添加回答
舉報(bào)