更简单地使用TypeAdapterFactory
AFAIK可以通过进行最灵活的gson定制TypeAdapterFactory
,但是它可能变得不必要地复杂。它迫使我为每个处理的类read
和都编写代码write
,而有时只需要一种方法。此外,有时JsonSerializer
和/或JsonDeserializer
更容易编写,例如在这里。这使我想到了以下问题:
- 是否可以编写一个
TypeAdapter
仅委托其方法之一(例如,从写入ImmutableList
到写入List
)的a? - 是否可以以某种方式使用
JsonSerializer
和/或JsonDeserializer
与它一起使用TypeAdapterFactory
?另外,他们有工厂吗?
回答:
可以创建一个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
,将跳过中间步骤。
这使类型适配器代码的读写变得有些棘手,因此您仅应将其用于优化代码。
以上是 更简单地使用TypeAdapterFactory 的全部内容, 来源链接: utcz.com/qa/402976.html