How to write a single Deserializer working for all ImmutableList?
这个想法很简单,转换代表一个ImmutableList< T>转换为表示List< T>的类型,使用内置的Gson的能力来创建List并将其转换为ImmutableList.
class MyJsonDeserializer implements JsonDeserializer> {
@Override
public ImmutableList> deserialize(JsonElement json,Type type,JsonDeserializationContext context) throws JsonParseException {
final Type type2 = ParameterizedTypeImpl.make(List.class,((ParameterizedType) type).getActualTypeArguments(),null);
final List> list = context.deserialize(json,type2);
return ImmutableList.copyOf(list);
}
}
我使用的Java库中有多个ParameterizedTypeImpl类,但它们都不用于公共使用.我用sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl测试了它.
How to register it for all ImmutableList?
这部分是微不足道的,注册的第一个参数是java.lang.reflect.Type,这误导了我使用ParameterizedType,其中简单地使用Class做这个工作:
final Gson gson = new GsonBuilder()
.registerTypeAdapter(ImmutableList.class,myJsonDeserializer)
.create();