GSON 2.2.2无法序列化类型“?extend someInterface”

时间:2014-01-22 14:10:41

标签: java serialization gson

Gson 2.2.2无法序列化Object1中的字段。

public class Test {

    public static void  main(String[] args){
        Object1 o1 = new Object1();
        List<Interface1> list1 = new ArrayList<Interface1>();
        Interface1 f1 = new InterfaceImp();
        list1.add(f1);
        o1.field = list1;
        System.out.println(new Gson().toJson(o1));
    }
}
interface Interface1{}
class  InterfaceImp implements Interface1{
    public String s = "123";
}
class Object1 {
    public List<? extends Interface1> field ;
}

在debuging时,我在 TypeAdapterRuntimeTypeWrapper 中找到了方法:

private Type getRuntimeTypeIfMoreSpecific(Type type, Object value) {
    if (value != null && (type == Object.class || type instanceof TypeVariable<?> || type instanceof Class<?>)) {
       type = value.getClass();
}
    return type;
}

不返回value.getClass()。 arg'type'(?extends Interface1 )使得if测试变得非常好。一个错误?

1 个答案:

答案 0 :(得分:0)

我认为您需要指定您在列表

中使用的通用类型

检查此链接

https://sites.google.com/site/gson/gson-user-guide#TOC-Collections-Examples

例如,序列化列表:

Type type = new TypeToken<List<Interface1>>(){}.getType();
String s = new Gson().toJson(list1, type);

工作代码(已测试)

public static void main(String[] args) {
    Object1 o1 = new Object1();
    List<Interface1> list1 = new ArrayList<Interface1>();
    Interface1 f1 = new InterfaceImp();
    list1.add(f1);
    list1.add(f1);
    o1.field = list1;

    String s = getGsonWithAdapters().toJson(o1);
    System.out.println(s);
}

public static Gson getGsonWithAdapters() {
    GsonBuilder gb = new GsonBuilder();
    gb.serializeNulls();
    gb.registerTypeAdapter(Object1.class, new CustomAdapter());
    return gb.create();
}

public static class CustomAdapter implements JsonSerializer<Object1> {
    @Override
    public JsonElement serialize(Object1 obj, Type type,
            JsonSerializationContext jsc) {
        JsonObject jsonObject = new JsonObject();
        Type t = new TypeToken<List<Interface1>>() {}.getType();
        jsonObject.add("field", new Gson().toJsonTree(obj.field, t));
        return jsonObject;
    }
}