2014-01-30 3 views
0

У меня есть этот фрагмент кода:Deserialzing работает в gson-2.1, но не gson-2.4.4

HashMap<String, List<ClassOne>> mappingMap = new HashMap<String, List<ClassOne>>(); 
String key = "pop"; 
ClassOne c1 = new ClassOne(); 
c1.setCategoryName("categoryName"); 
ArrayList<ClassOne> al = new ArrayList<ClassOne>(); 
al.add(c1); 
mappingMap.put(key, al); 
Gson gson = new Gson(); 
String data = gson.toJson(mappingMap); 
HashMap<String, List<ClassOne>> dmm = gson.fromJson(data, new TypeToken<Map<String, List<ClassOne>>>() {}.getType()); 

Это при запуске с gson-2.1.jar, он прекрасно работает. При запуске с gson-2.2.4.jar я получаю следующее исключение

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap не может быть приведен к java.util.HashMap на ком. .....

Удивление, если кто-нибудь может объяснить или указать, что я делаю неправильно.

ответ

2

Я не знаю, о 2.1, но если это правда, что он работал, то Gson должно быть изменены их реализация по умолчанию Map использовать при десериализации Map типов от HashMap к LinkedTreeMap в gson-2.2.4.

Если вы хотите продолжить использовать HashMap, укажите его в TypeToken.

new TypeToken<HashMap<String, List<ClassOne>>>() 
+1

+1 - Чтобы быть более точным, единственная причина, она работала в первую очередь будет связано с * чистого везения *, что Gson использует 'HashMap' когда' интерфейс Map' был принят в через операторы ' TypeToken'. И теперь ... это не так. –

+0

да, я считаю, что это просто удача, что я нашел это. Ваше решение решило проблему.THANKS! –

+1

Еще лучше, используйте 'Map' с обеих сторон: в типе параметра и в типе декларации. Это будет поддерживать LinkedTreeMap за кадром, и у него есть защита от атак DoS-атак с хеш-коллизацией. –

Смежные вопросы