Java / GSON – Serializing and Deserializing Generic Types

gson - json

Quando você chama .toJson(obj) o Gson internamente usa obj.getClass() para obter informações sobre os campos para serializar. Da mesma forma na deserialização se passa MyClass.class no método fromJson(json, MyClass.class). Isso funciona bem se o objeto é um tipo não-genérico. No entanto, se o objeto é de um tipo genérico as informações são perdida porcausa da sua generalização. Segue um exemplo:

class Foo<T> {
  T value;
}

Gson gson = new Gson();

Foo<Bar> foo = new Foo<Bar>();
// Não pode serializar foo.value corretamente:
gson.toJson(foo);
// Falha ao deserializar foo.value as Bar:
gson.fromJson(json, foo.getClass()); 

O código acima não consegue interpretar  o valor como um tipo Bar porque o Gson invoca list.getClass() para pegar a informação da classe, mas esse método retorna uma classe cru, Foo.class. Isto significa que Gson não têm nenhuma maneira de saber que este é um objeto do tipo Foo <Bar>, e não simplesmente Foo.

Você pode resolver esse problema especificando o tipo correto para o seu tipo genérico. Você pode fazer isso usando a classe TypeToken veja o exemplo: Continue reading