如何在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
实例传递给TypeAdapter
的read
或write
方法。 所以如果你有一个像这样的对象:
public class MyOuterClass { private MyInnerClass inner; }
没有使用TypeAdapter
,无法编写知道如何使用TypeAdapter
的TypeAdapter
。 TypeAdapterFactory.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 } } }