2015-03-02 173 views
0

实施例类:爪哇GSON - 序列化&反序列化类泛型类型为List

public class A 
{ 
    String Name; 
    List<B> GenericsList; 

    //Getters & Setters & Constructors 
} 

public class B 
{ 
    String Title; 
    //Getters & Setters & Constructors 
} 

public class C extends B 
{ 
    String Something; 
    //Getters & Setters & Constructors 
} 

如果我序列类A的一个实例是这样的:

List<B> bList = new ArrayList<>(); 
C bObj = new C("name", "something text"); 
bList.add(bObj); 

A aObj = new A("name", bList); 

String serialized = new Gson.toJson(aObj); 

A deserializedA = new Gson.fromJson(serialized); 

我失去的C亚型在列表。 我知道如何解决这一点,如果它只是一个列表序列化是这样的:

Gson gson = new Gson(); 
List<B> bList = new ArrayList<>(); 

Type bType = new TypeToken<List<B>>() {}.getType(); 
gson.toJson(bList, bType); 

gson.fromJson(json, bType); 

的问题是,我的泛型列表是与其他参数的对象内。我该怎么做呢?

编辑1: 也许我不清楚具体问题。

当我进行序列化和反序列化创建的对象上没有错误而是获得这样的: 对象A: 名称=“名称” GenericsList = {对象C}

我得到: 对象A: Name =“name” GenericsList = {Object B}

我失去了子类型C的细节。

+0

您可以发布与预期输出一个完整的例子吗?请详细了解您所看到的行为以及您所问的内容。 – 2015-03-02 16:24:21

+0

您应该阅读[与Gson多态性](http://stackoverflow.com/questions/5800433/polymorphism-with-gson)。 – 2015-03-02 16:32:42

+0

没有帮助。问题是,我想要反序列化的对象中有一个泛型类型列表。找不到具体的答案.... – Meh 2015-03-02 17:08:40

回答

0

Got it!感谢提示Sotirios Delimanolis!

必须创建为B类的自定义实现:

class BGsonAdapter implements JsonSerializer<B>, JsonDeserializer<B> 
{ 
    public JsonElement serialize(B bObj, Type typeOfSrc, JsonSerializationContext context) 
    { 
     JsonObject result = new JsonObject(); 
     result.add("Title", context.serialize(B.getTitle(), String.class)); 

     if (bObj instanceof C) 
     { 
      result.add("Something", context.serialize(((C)bObj).getSomething(), String.class)); 
     } 

     return result; 
    } 

    public B deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException 
    { 
     JsonObject object = json.getAsJsonObject(); 
     B result = null; 

     if (object.has("Something")) 
     { 
      result = new C(); 
      ((C) result).setSomething((String)context.deserialize(object.get("Something"), String.class)); 

     if (result == null) 
     { 
      result = new B(); 
     } 
     result.setTitle(((String)context.deserialize(object.get("Title"), String.class))); 

     return result; 
    } 
} 

,并使用它像这样:

Gson gson = new GsonBuilder() 
      .registerTypeHierarchyAdapter(B.class, new BGsonAdapter()) 
      .setPrettyPrinting() 
      .create(); 

String serialized = gson.toJson(A); 

A deserialized = (A)gson.fromJson(A);