关于一种fastjson的死循环情况记录

本文记录了一种使用fastjson进行接口转换时出现的StackOverflow错误现象。当在get方法内部再次使用fastjson进行json转换时,会导致无限递归直至栈溢出。文中详细解释了错误发生的原因,并提供了错误代码实例。

关于一种fastjson的死循环情况记录

最近在一次项目中,使用fastjson做接口转换中,碰到了一个Stack Overflow。发现在getxxx方法内如果再次嵌套使用fastjson作json转换,就会无限循环。

错误实例:

1 class IAmStupid{
2     private String a;
3     public String getJson(){
4         return JSON.toJSONString(this);
5     }    
6 }

 

原因:fastjson底层获取bean数据序列化时,在ASMSerializerFactory的createJavaBeanSerializer方法中,会获取bean的getter方法。然后调用get方法获取数据,在调用getJson时,会再次进入this的序列化,依次循环嵌套,最终栈溢出。

有兴趣的可以试一下,并跟进代码。

 

posted @ 2018-03-22 19:25 Code-Juggler 阅读( ...) 评论( ...) 编辑 收藏
### Fast 反序列化死循环解决方案 当处理 fast 序列化和反序列化的场景时,如果存在复杂的对象图结构(特别是有环形引用的对象),可能会遇到死循环问题。为了防止这种情况发生,一种常见的方法是在反序列化过程中引入唯一性检查机制。 具体实现方式可以通过维护一个已访问过的对象映射表,在每次创建新实例之前先查询该表是否存在相同标识的对象。这能有效避免重复构建同一对象而导致无限递归的情况[^1]。 以下是基于此思路的一个简化版 Java 实现: ```java import java.util.HashMap; import java.util.Map; public class SafeDeserializer<T> { private final Map<String, Object> visitedObjects = new HashMap<>(); @SuppressWarnings("unchecked") public T deserialize(String objectId, Class<T> clazz) throws Exception { // 如果已经存在,则直接返回已有对象 if (visitedObjects.containsKey(objectId)) { return (T) visitedObjects.get(objectId); } // 创建新的对象并加入到已访问列表中 T instance = clazz.getDeclaredConstructor().newInstance(); visitedObjects.put(objectId, instance); // 继续填充其他属性... return instance; } } ``` 通过这种方式可以在很大程度上减少甚至消除由复杂对象关系引起的反序列化过程中的潜在风险。同时建议开发者仔细审查数据模型设计,尽可能简化对象之间的依赖关系,从而从根本上降低此类问题发生的可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值