更简单地使用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

回到顶部