fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[BUG]BigDecimal带class序列化后,再反序列化对象变成了Integer

Open danjiaxinvip opened this issue 1 month ago • 4 comments

问题描述

简要描述您碰到的问题。

Image

环境信息

请填写以下信息:

  • OS信息: [e.g.:CentOS 8.4.2105 4Core 3.10GHz 16 GB] windows11
  • JDK信息: [e.g.:Openjdk 1.8.0_312] jdk21
  • 版本信息:[e.g.:Fastjson2 2.x.x] 2.0.59

重现步骤

如何操作可以重现该问题:

  1. 使用 xxx.xxx 方法
  2. 输入 ... 数据
  3. 出现 ... 错误
//可在此输入示例代码

期待的正确结果

对您期望发生的结果进行清晰简洁的描述。 反序列化的对象也是BigDecimal

相关日志输出

请复制并粘贴任何相关的日志输出。

附加信息

如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。

danjiaxinvip avatar Nov 04 '25 14:11 danjiaxinvip

这个不是 bug。对于数字类型,在反序列化时 fastjson2 会根据大小自动推断其类型,对于大小在 int 范围内的数字,会将其解析成通用的 Integer 类型;对于范围在 long 内的解析成 Long;超过 long 范围则解析为 BigDecimal。

我觉得这种设计是出于性能和通用性的考虑。在多数场景下,一个整数被当作 Integer 或 Long 处理是最高效的。如果所有数字,无论大小,都默认反序列化成 BigDecimal,会带来不必要的性能开销和内存占用。

jujn avatar Nov 05 '25 03:11 jujn

至于反序列化时怎样保持 BigDecimal,我觉得目前 GenericFastJsonRedisSerializer#deserialize 中貌似缺少一个重载版本: public Object deserialize(byte[] bytes, Type type)

GenericFastJsonRedisSerializer我用这个工具进行序列化BigDecimal对象,而且反序列化回去报错,不就是有问题吗,而且我不知道反序列化的类型,public Object deserialize(byte[] bytes, Type type)这个方法也没有意义。 我现在想序列化后,再反序列化类型能匹配,那这个怎么处理

danjiaxinvip avatar Nov 05 '25 03:11 danjiaxinvip

这个设计如此,对于部分java内置类型BigDecimal,即使设置了Feature.WriteClassName,序列化时也不会写入类型信息,反序列化时只能自动推断。如果有deserialize(byte[] bytes, Type type)可以在序列化前拿到对象类型,在反序列化时传入即可

我现在反序列化的时候就是不知道里面存的是那种2,不知道这个2该序列化成Integer的2还是BigDecimal

danjiaxinvip avatar Nov 05 '25 05:11 danjiaxinvip

那么问题来了,提供了 WriteLongAsString 然后没有提供 WriteBigDecimal AsString

xzxiaoshan avatar Nov 29 '25 02:11 xzxiaoshan