2014-01-30 74 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中的COM。 .....

想知道是否有人能解釋,或指出我做錯了什麼。

回答

2

我不知道2.1,但如果它是真的,它的工作,然後GSON必須改變其默認Map實施GSON-2.2.4從HashMap反序列化Map類型LinkedTreeMap時使用。

如果要繼續使用HashMap,請在TypeToken中指定它。

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

+1 - 更具體,只有它擺在首位的工作的原因是由於*純粹的運氣*這GSON使用'HashMap'當'Map'接口,通過傳遞在' TypeToken'。現在......不是。 –

+0

是的,我相信這只是運氣,我發現。你的修復解決了這個問題。 –

+1

更好的是,在參數類型和聲明類型兩邊使用'Map'。這將保持LinkedTreeMap的幕後,並且可以抵禦散列衝突DoS攻擊。 –

相關問題