我們項目組的A系統依靠B系統寫入Redis中的數據對象工作。這個對象是一個Map對象,Map對象寫入Redis很簡單,先JSON化,然後Set入Redis即可。但是用JSON提供的反解析方法的時候,得到的是Map<String, JSONObject> 類型,而我希望得到的是Map<String, DDRouteRuleEntry>類型。也就是DDRouteRuleEntry類型並沒有被正確的解析。
只好順應這個結果進行反序列化,然後將每個JSONObject對象再次反序列化成DDRouteRuleEntry類型,也就是進行了N+1次反序列化工作。代碼如下:
@SuppressWarnings("unchecked")
@Override
public Map<String, DDRouteRuleEntry> readDDRouteMap() {
try {
String dDRouteMapJson = cacheServiceForServer.readDDRouteRuleMap();
if (StringUtils.isNotBlank(dDRouteMapJson)) {
Map<String, DDRouteRuleEntry> abtWaiterMap = new LinkedHashMap<String, DDRouteRuleEntry>();
Map<String, JSONObject> tempMap = null;
tempMap = JSON.parseObject(dDRouteMapJson, new LinkedHashMap<String, JSONObject>().getClass());
if (tempMap != null) {
for(String key : tempMap.keySet()){
JSONObject str = tempMap.get(key);
DDRouteRuleEntry ddRouteEntry = null;
ddRouteEntry = JSON.parseObject(str.toJSONString(), DDRouteRuleEntry.class);
abtWaiterMap.put(key, ddRouteEntry);
}
}
return abtWaiterMap;
}
} catch (Exception ex) {
LOG.error("reading and transferring DDRouteRuleMap json errors!");
return new LinkedHashMap<String, DDRouteRuleEntry>();
}
return new LinkedHashMap<String, DDRouteRuleEntry>();
}
我用的是阿裡巴巴的fastjson進行的序列化反序列化操作。總體感覺Map對象的反序列化工作很繁雜,除非是Map<String, String>()。即使LIst<T>裡的T是個很復雜的PO,反解析也僅需要一行代碼。為了這個問題耗了我快個把小時,我把我的解決辦法貼出來供大家參考。為了這個問題耗了我快個把小時如果你有更好的反序列化方法,歡迎回復,大家一起學習學習~
fastjson 的詳細介紹:請點這裡
fastjson 的下載地址:請點這裡