fastjson1.0 坑

338 阅读1分钟
  1. 默认缺少构造函数/setter,无法反序列化。

  2. 基于第一点,在对象类型是接口/抽象类时,不能构造其对象,进而反序列化不成功。

  3. 虚假的getter/setter的序列化和反序列化

    1. fastjson的序列化/反序列化是依赖对象的默认构造方法、getter和setter。但在类的对象里,也有setxx()/getxxx()等样式的函数。函数本身并不直接返回/设置一个对象,而是有内部逻辑。所以这些函数往往序列化/反序列化失败

    2. 解决:

      1. 调用JSON.toJSONString的时候,加上SerializerFeature.IgnoreNonFieldGetter参数,忽略掉所有没有对应成员变量的getter函数。
      2. 在getxxx()函数上加上@JSONField(serialize=false)注解。
  4. 同引用对象的序列化。fastjson的功能:循环引用检测(默认开启)。比如两个对象A、B,A包含了指向B对象的引用,B包含了指向A对象的引用,A/B就变成了循环引用。如果序列化,会出现StackOverflowError的问题,但有循环引用检测的能力,所以可以序列化成功。

    1. bug在于:会错误的检测,例如当只是重复引用了一个对象时,也会使用引用检测的能力。