2015-03-02 2 views
0

Примеры классов:Java GSON - сериализации и Deserialize класса со списком типа генерики

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 
} 

Если я сериализовать экземпляр класса А, как это:

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: Name = "Имя" GenericsList = {Object C}

я получаю: объекта A: Name = "name" GenericsList = {Object B}

Я теряю подтип C детали.

+0

Можете ли вы опубликовать полный пример с ожидаемым выходом? И, пожалуйста, расскажите подробнее о поведении, которое вы видите, и о том, о чем вы спрашиваете. –

+0

Вы должны прочитать [Полиморфизм с помощью Gson] (http://stackoverflow.com/questions/5800433/polymorphism-with-gson). –

+0

Не помогло. Проблема в том, что у меня есть общий тип List внутри объекта, который я хочу десериализовать. Не могу найти конкретного ответа на этот вопрос .... – Meh

ответ

0

Получил это! Спасибо за отзыв 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); 
Смежные вопросы