背景
表中有个feature字段,需要存入一些json格式数据的字符串。页面需要展示去获取该值,进行反序列化时发生了异常。
场景重现
- 测试代码:
代码说明: - 向Map<Long,Long>结构的map中存放两个数据,都是Long类型的值。
反序列化时的值,有的还是Long,有的变为Integer类型了。
但是外层的map类型还是Map<Long,Long>。
问题
问题1:获取不到值
明明存放进去时是Long类型啊,现在取的时候是Integer类型了。很奇怪!
- map里的key变为了Integer类型的1,用Long类型的1来获取肯定获取不到了。
问题2:类型转换异常
这里我们代码改动下,存放的数据增加一种key是Long longKey = Long.valueOf(Integer.MAX_VALUE)+1L;
value = 1L;的情况。
解决办法:Long value3 = Long.valueOf(String.valueOf(resultMap.get(longKey)));
总结:
- 阿里fastjson在将整形的value值反序列化时,会根据值得具体长度生成不同的类型,一旦值超过Integer型的表达范围就
会反序列化成Long; 在Integer以内会反射为Integer。
- 还有啥的Double会反射为BigDecimal。
- 其实不用记,每次使用的时候留个心眼,断点看一下是什么类型,注意处理下就好了。