关于数据序列化(4),FastJson的两个bug
来源:互联网 发布:与外国人学外语知乎 编辑:程序博客网 时间:2024/05/17 10:54
bug1 fastJson循环引用引发一个bug
fastJson可以将一个对象序列化为json,也可以通过反序列化出一个完整的对象。且支持循环引用。
package com.sincetimes.website.core.common.support;import com.sincetimes.website.core.common.vo.ToStringAbstract;/** ::new */public class DataSimpleVO { public String name; public Object value; public Object value1; public DataSimpleVO() { } public DataSimpleVO(String name, Object value) { this.name = name; this.value = value; } @Override public String toString() { return "DataSimpleVO [name=" + name + ", value=" + value + ", value1=" + value1 + "]"; }}
DataSimpleVO a = new DataSimpleVO("a", 1); DataSimpleVO b = new DataSimpleVO("b", 2); b.value = a; Map<String, Object> map = new HashMap<>(); map.put(a.name, a); b.value1 = map; String jsonStr = JSON.toJSONString(b); System.out.println(jsonStr); DataSimpleVO obj = JSON.parseObject(jsonStr, DataSimpleVO.class); System.out.println(obj.toString());
执行结果
{"name":"b","value":{"name":"a","value":1},"value1":{"a":{"$ref":"$.value"}}}DataSimpleVO [name=b, value={"name":"a","value":1}, value1={"a":{"name":"a","value":1}}]
反序列化成功
改一下代码
DataSimpleVO a = new DataSimpleVO("a", 1); DataSimpleVO b = new DataSimpleVO("b", 2); b.value1 = a; Map<String, Object> map = new HashMap<>(); map.put(a.name, a); b.value = map; String jsonStr = JSON.toJSONString(b); System.out.println(jsonStr); DataSimpleVO obj = JSON.parseObject(jsonStr, DataSimpleVO.class); System.out.println(obj.toString());
执行结果
{"name":"b","value":{"a":{"name":"a","value":1}},"value1":{"$ref":"$.value.a"}}DataSimpleVO [name=b, value={"a":{"name":"a","value":1}}, value1=null]
b中的value1为空,反序列化失败
bug2 要序列化的类含有Class类型属性引起的循环递归无法结束最后内存溢出
要序列化、反序列化的类
public class Request implements Serializable { private static final long serialVersionUID = -3145939364922415428L; private Class<?> clazz; private String method; private Object param; public Class<?> getClazz() { return clazz; } public void setClazz(Class<?> clazz) { this.clazz = clazz; } public String getMethod() { return method; } public void setMethod(String method) { this.method = method; } public Object getParam() { return param; } public void setParam(Object param) { this.param = param; } public Object invoke(Object bean) throws Exception { return clazz.getMethod(method, param.getClass()).invoke(bean, param); }}
触发bug
Request r = new Request(); r.setClazz(Integer.class); String s = JSON.toJSONString(r, SerializerFeature.WriteClassName); System.out.println(s); JSON.parseObject(s);//bug 触发
我们看看内部
public static JSONObject parseObject(String text) { Object obj = parse(text); if (obj instanceof JSONObject) { return (JSONObject) obj; } return (JSONObject) JSON.toJSON(obj); }
如果改为JSON.parseObject(s, Request.class);或者直接使用JSON.parse(str)就没问题。
最后的建议:
不要使用JSON.parseObject(…)只使用JSON.parse(str);
阅读全文
0 0
- 关于数据序列化(4),FastJson的两个bug
- 关于fastjson序列化不可见特殊字符存在的bug
- 关于数据序列化(3),JSON的方式,FastJson序列化对象和List集合示例
- FastJSON序列化特殊字符BUG
- 关于数据序列化(5),定制FastJSON序列化(解决Java大Long类型js的Number接收丢失数据的问题,不序列化某些属性)
- 关于数据序列化(3),使用JSON的方式,以及几个注意的点,以及fastJson的坑
- FastJSON序列化的使用
- 关于fastjson序列化部分源码解析
- 关于宏的两个bug
- fastjson 过滤不需要序列化的属性
- Fastjson的SerializerFeature序列化属性
- 用fastjson将数据序列化和反序列化给jfinal的model的方案
- fastjson序列化数据为空的字段如何处理的问题
- FastJson定制序列化
- fastjson自定义序列化
- fastJson序列化
- FastJson序列化问题
- 关于使用STL常见的两个bug
- 关于ubuntu16.04下无线驱动的问题
- set方式注入属性的一个小细节
- solr数据导入
- 面向对象2
- python实现完整的求解给定列表中所有的平衡点问题,是所有的平衡点
- 关于数据序列化(4),FastJson的两个bug
- QUAKE 3源代码审查:网络模型
- sql优化
- 个人博客主页搭建随笔
- Java中的正则语法小结
- 相机的选购
- (二十一)Android内存、性能优化
- Idea集成SVN,checkout公司项目
- Redux源码拾遗,关于createStore的第三个参数