如何在Gson中实现TypeAdapterFactory?

如何在Gson中实现TypeAdapterFactory类型?

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

注册方法registerTypeAdapterFactory()不接收类型参数。 那么, 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的默认类型适配器。

那么,如何创建一个可以将ANY Animal子类转换为Json的类型适配器对象? 创建一个TypeAdapterFactory ! 工厂可以使用generics类型和TypeToken类进行匹配。 如果您的TypeAdapterFactory不知道如何处理该类型的对象,则应返回null。

TypeAdapterFactory可以使用的另一件事是你不能以任何其他方式使用CHAIN适配器。 默认情况下,Gson不会将您的Gson实例传递给TypeAdapterreadwrite方法。 所以如果你有一个像这样的对象:

 public class MyOuterClass { private MyInnerClass inner; } 

没有使用TypeAdapter ,无法编写知道如何使用TypeAdapterTypeAdapterTypeAdapterFactory.create方法传递Gson实例,它允许您教您的TypeAdapter如何序列化MyInnerClass字段。


通常,这是开始编写TypeAdapterFactory实现的一种很好的标准方法:

 public enum FooAdapterFactory implements TypeAdapterFactory { INSTANCE; // Josh Bloch's Enum singleton pattern @SuppressWarnings("unchecked") @Override public  TypeAdapter create(Gson gson, TypeToken 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) new FooAdapter(); } private static class FooAdapter extends TypeAdapter { @Override public void write(JsonWriter out, Foo value) { // your code } @Override public Foo read(JsonReader in) throws IOException { // your code } } }