Suz*_*ioc 23 java serialization json gson deserialization
如何在Gson中实现TypeAdapterFactory类型?
创建的主要方法是通用的.为什么?
注册方法registerTypeAdapterFactory()不接收类型参数.那么,如何Gson知道工厂处理哪些类?
我应该为多个类实现一个工厂,还是可以为多个类实现一个工厂?
如果我为多个类实现一个工厂,那么在域外类型参数的情况下我应该返回什么?
dur*_*597 41
注册常规类型的适配器(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));
Run Code Online (Sandbox Code Playgroud)
如果您这样做,那么Gson将不会使用您的myTypeAdapterObject,它将使用默认类型适配器Object.
那么,如何创建一个可以将任何子Animal类转换为Json 的类型适配器对象?创建一个TypeAdapterFactory!工厂可以使用泛型类型和TypeToken类匹配.如果您TypeAdapterFactory不知道如何处理该类型的对象,则应返回null .
TypeAdapterFactory可以使用的另一件事是你不能以任何其他方式链接适配器.默认情况下,Gson不会将您的Gson实例传递给read或者write方法TypeAdapter.所以如果你有一个像这样的对象:
public class MyOuterClass {
private MyInnerClass inner;
}
Run Code Online (Sandbox Code Playgroud)
没有办法写你的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
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16808 次 |
| 最近记录: |