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