网上有很多关于如何使用Gson在Java中进行自定义序列化/反序列化的例子(例如,Java Creed有一个很好的教程)。我没有找到,我不明白的是,我应该如何使用JsonSerializer#serialize(T, Type, JsonSerializationContext)方法的第二个Type
参数。
它只是用于我的实现中的类型检查吗?有人可以提供一个说明性的例子吗?
答案 0 :(得分:1)
它可以用于使用相等而不是instanceof来测试对象的类,因为Class实现了Type接口。
这是一个使用registerTypeHierarchyAdapter()和一个序列化程序的工作示例,该序列化程序的行为取决于类型参数。
public static class Animal { }
public static class Horse extends Animal {}
public static class Sheep extends Animal {}
private static class MySerializer implements JsonSerializer<Animal> {
@Override
public JsonElement serialize(Animal src, Type typeOfSrc,
JsonSerializationContext context) {
JsonPrimitive element = null;
if (typeOfSrc == Sheep.class) {
element = new JsonPrimitive("sheep");
} else if (typeOfSrc == Horse.class) {
element = new JsonPrimitive("horse");
}
return element;
}
}
public static void main(String[] args) {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeHierarchyAdapter(Animal.class, new MySerializer());
System.out.println(builder.create().toJson(
Arrays.asList(new Horse(), new Sheep())));
}
这应该相当于
@Override
public JsonElement serialize(Animal src, Type typeOfSrc,
JsonSerializationContext context) {
JsonPrimitive element = null;
if (src instanceof Sheep) {
element = new JsonPrimitive("sheep");
} else if (src instanceof Horse) {
element = new JsonPrimitive("horse");
}
return element;
}
使用src和typeOfSrc之间的区别似乎很微妙,我还在研究。 java.lang.Type是所有类型的超级接口。因此,可能存在一些极端情况,您可以使用“类型”来执行某些操作。
java.lang.reflect.Type
=> java.lang.Class
=> GenericArrayType
=> ParameterizedType
=> TypeVariable
=> etc.