如何在Gson中实现TypeAdapterFactory类型?

创建的主要方法是通用的。为什么?

注册方法registerTypeAdapterFactory()不接收type-type参数。那么,Gson如何知道工厂处理了哪些类?

我应该为多个类实现一个工厂,还是可以为多个类实现一个工厂?

如果我为多个类实现一个工厂,那么在域外类型参数的情况下应该返回什么?

最佳答案

当您注册常规类型适配器(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实例传递到readwriteTypeAdapter方法中。因此,如果您有一个像这样的对象:
public class MyOuterClass {
    private MyInnerClass inner;
}

如果不使用TypeAdapter<MyOuterClass>,就无法编写知道如何使用TypeAdapter<MyInnerClass>TypeAdapterFactoryTypeAdapterFactory.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
        }
    }
}

10-07 23:40