如何在Gson中实现TypeAdapterFactory?

时间:2014-03-10 17:40:56

标签: java json serialization gson deserialization

如何在Gson中实现类型TypeAdapterFactory

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

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

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

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

1 个答案:

答案 0 :(得分:40)

注册常规类型适配器(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实例传递给read的{​​{1}}或write方法。所以如果你有一个像这样的对象:

TypeAdapter

如果不使用public class MyOuterClass { private MyInnerClass inner; } ,则无法编写知道如何使用TypeAdapter<MyOuterClass>的{​​{1}}。 TypeAdapter<MyInnerClass>方法通过TypeAdapterFactory实例,可让您教授TypeAdapterFactory.create如何序列化Gson字段。


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

MyInnerClass