在这种情况下,最好使用a
JsonSerializer而不是a
TypeAdapter,原因很简单,因为序列化程序可以访问其序列化上下文:
public class PairSerializer implements JsonSerializer<Pair> { public PairSerializer() { super(); } @Override public JsonElement serialize(final Pair value, final Type type, final JsonSerializationContext context) { final JsonObject jsonObj = new JsonObject(); jsonObj.add("first", context.serialize(value.getFirst())); jsonObj.add("second", context.serialize(value.getSecond())); return jsonObj; }}上面的示例代码说明了如何将目标对象的序列化委派回主编组器。这样做的主要优点(除了避免复杂的解决方法)是,您仍然可以利用可能已经在主上下文中注册的其他类型的适配器和自定义序列化程序。请注意,序列化器和适配器的注册使用完全相同的代码:
// With adapterfinal Gson gson = new GsonBuilder().registerTypeAdapter(Pair.class, new PairAdapter()).create();// With serializerfinal Gson gson = new GsonBuilder().registerTypeAdapter(Pair.class, new PairSerializer()).create();
如果发现需要使用适配器,则可以使用嵌入式Gson代理为您序列化Pair属性,其缺点是您无法访问在父Gson代理上进行的自定义注册:
public class PairAdapter extends TypeAdapter<Pair> { final Gson embedded = new Gson(); public PairAdapter() { super(); } @Override public void write(final JsonWriter out, final Pair value) throws IOException { out.beginObject(); out.name("first"); embedded.toJson(embedded.toJsonTree(value.getFirst()), out); out.name("second"); embedded.toJson(embedded.toJsonTree(value.getSecond()), out); out.endObject(); } @Override public Pair read(JsonReader in) throws IOException { throw new UnsupportedOperationException(); }}


