У меня есть этот фрагмент кода: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 на ком. .....
Удивление, если кто-нибудь может объяснить или указать, что я делаю неправильно.
+1 - Чтобы быть более точным, единственная причина, она работала в первую очередь будет связано с * чистого везения *, что Gson использует 'HashMap' когда' интерфейс Map' был принят в через операторы ' TypeToken'. И теперь ... это не так. –
да, я считаю, что это просто удача, что я нашел это. Ваше решение решило проблему.THANKS! –
Еще лучше, используйте 'Map' с обеих сторон: в типе параметра и в типе декларации. Это будет поддерживать LinkedTreeMap за кадром, и у него есть защита от атак DoS-атак с хеш-коллизацией. –