public void someMethod(long uid){
set.add(uid);
po.setString(JSON.toJSONString(set));
}// 這段代碼是web項目的,online會調用複製代碼
JSON.toJSONString(set, SerializerFeature.WriteClassName)
這樣的 String 就是Set[1234567890L] 那麼反序列化也 OK 了com.alibaba.fastjson.JSONException: exepct '[', but error
查了半天,最後懷疑線上 online 的 jar 包有問題,聯繫運維查了下 online 的 classpath,不出所料,當時心裏十分日狗這裏又關係到 class 的加載問題,可是很明顯 online 用的是1.1.2的版本,推測緣由有二java
其一File#compareTo(File pathname)
最後調用的仍是String#CaseInsensitiveComparator#compare(String, String)
linux
其二因爲該排序是 linux 默認的,因此 classloader 加載的時候會判斷,若是已經加載過同包同名的 class,則不加載後者web
綜上所述,其實這個問題就是依賴管理糟糕的坑,至於爲何線上 online 會有兩個 fastjson我也問了運維,歷史緣由。可是,若是是用 maven之類的依賴管理工具的話,應該會避免此類問題json
後續:仍是想搞清楚到底怎麼回事!運維
下面兩個圖是在加載 jre\lib\ett\*.jar 的時候的斷點,經過線程的棧幀和棧幀中的數據,很明顯證實個人推測一是正確的,爲個人直覺感到欣慰!maven