当您注册一个常规类型适配器 (GsonBuilder.registerTypeAdapter) 时,它只会为该特定类生成一个类型适配器。例如:
public abstract class Animal { abstract void speak(); }
public class Dog extends Animal {
private final String speech = "woof";
public void speak() {
System.out.println(speech);
}
}
// in some gson related method
gsonBuilder.registerTypeAdapter(Animal.class, myTypeAdapterObject);
Gson g = gsonBuilder.create();
Dog dog = new Dog();
System.out.println(g.toJson(dog));
如果你这样做了,那么Gson 将不使用你的myTypeAdapterObject,它将使用Object 的默认类型适配器。
那么,如何创建一个可以将任何Animal 子类转换为 Json 的类型适配器对象?创建一个TypeAdapterFactory!工厂可以使用泛型类型和TypeToken 类进行匹配。如果您的 TypeAdapterFactory 不知道如何处理该类型的对象,您应该返回 null。
TypeAdapterFactory 可用于的另一件事是您不能以任何其他方式链接适配器。默认情况下,Gson 不会将您的 Gson 实例传递给 TypeAdapter 的 read 或 write 方法。所以如果你有一个像这样的对象:
public class MyOuterClass {
private MyInnerClass inner;
}
如果不使用TypeAdapterFactory,就无法编写知道如何使用TypeAdapter<MyInnerClass> 的TypeAdapter<MyOuterClass>。 TypeAdapterFactory.create 方法确实传递了 Gson 实例,它允许您教您的 TypeAdapter<MyOuterClass> 如何序列化 MyInnerClass 字段。
一般来说,这是开始编写TypeAdapterFactory 实现的一个很好的标准方法:
public enum FooAdapterFactory implements TypeAdapterFactory {
INSTANCE; // Josh Bloch's Enum singleton pattern
@SuppressWarnings("unchecked")
@Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
if (!Foo.class.isAssignableFrom(type.getRawType())) return null;
// Note: You have access to the `gson` object here; you can access other deserializers using gson.getAdapter and pass them into your constructor
return (TypeAdapter<T>) new FooAdapter();
}
private static class FooAdapter extends TypeAdapter<Foo> {
@Override
public void write(JsonWriter out, Foo value) {
// your code
}
@Override
public Foo read(JsonReader in) throws IOException {
// your code
}
}
}