可以创建一个
TypeAdapter委派其方法之一的方法。这个用例是API的重要组成部分,并且有一个getDelegateAdapter()方法用于此目的。通过
this作为第一个参数
getDelegateAdapter将返回,目前出厂后优先适配器。
TypeAdapterFactory immutableListFactory = new TypeAdapterFactory() { @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { if (!(type.getType() instanceof ParameterizedType) || !type.getRawType().equals(ImmutableList.class)) { return null; } ParameterizedType parameterizedType = (ParameterizedType) type.getType(); TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type); TypeAdapter<?> elementAdapter = gson.getAdapter( TypeToken.get(parameterizedType.getActualTypeArguments()[0])); return new ImmutableListAdapter(delegate, elementAdapter); } class ImmutableListAdapter<E> extends TypeAdapter<ImmutableList<E>> { private TypeAdapter<List<E>> delegate; private TypeAdapter<E> element; ImmutableListAdapter(TypeAdapter<List<E>> delegate, TypeAdapter<E> element) { this.delegate = delegate; this.element = element; } @Override public void write(JsonWriter out, ImmutableList<E> value) throws IOException { delegate.write(out, value); } @Override public ImmutableList<E> read(JsonReader in) throws IOException { if (in.peek() == JsonToken.NULL) { in.nextNull(); return null; } ImmutableList.Builder<E> builder = ImmutableList.builder(); in.beginArray(); while (in.hasNext()) { builder.add(element.read(in)); } in.endArray(); return builder.build(); } }};您可以将
JsonSerializer/
JsonDeserializer与混合搭配
TypeAdapterFactory,但不能直接搭配。最简单的方法是回调Gson来序列化类中的子值。在此示例中,我们将内部循环更改为:
while (in.hasNext()) { builder.add(gson.<E>fromJson(in, elementType)); }JsonSerializer/
JsonDeserializer和之间的主要区别
TypeAdapter是从JSON到您的对象模型需要多少阶段。使用
JsonSerializer/将
JsonDeserializer对象首先转换为Gson的DOM模型(
JsonElement等),然后再转换为您的对象模型。使用
TypeAdapter,将跳过中间步骤。
这使类型适配器代码的读写变得有些棘手,因此您仅应将其用于优化代码。



