如何在Gson中实现TypeAdapterFactory?
如何在Gson中实现TypeAdapterFactory类型?
创建的主要方法是通用的。为什么?
注册方法 registerTypeAdapterFactory() 不接收类型参数。那么,如何知道工厂处理了哪些类呢?Gson
我应该为多个类实现一个工厂,还是可以为多个类实现一个工厂?
如果我为多个类实现一个工厂,那么在域外类型参数的情况下,我应该返回什么?
如何在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
那么,如何制作一个可以将任何子类转换为Json的类型适配器对象呢?创建一个 !工厂可以使用泛型类型和类进行匹配。如果您不知道如何处理该类型的对象,则应返回 null。Animal
TypeAdapterFactory
TypeToken
TypeAdapterFactory
另一件可以使用的事情是,你不能以任何其他方式 CHAIN 适配器。默认情况下,Gson 不会将您的实例传递到 或 的方法中。因此,如果您有一个对象,例如:TypeAdapterFactory
Gson
read
write
TypeAdapter
public class MyOuterClass {
private MyInnerClass inner;
}
没有办法写你的,知道如何使用你的而不使用.该方法确实传递实例,这使您可以教您如何序列化字段。TypeAdapter<MyOuterClass>
TypeAdapter<MyInnerClass>
TypeAdapterFactory
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
}
}
}