[BUG]BigDecimal带class序列化后,再反序列化对象变成了Integer
问题描述
简要描述您碰到的问题。
环境信息
请填写以下信息:
- 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
重现步骤
如何操作可以重现该问题:
- 使用
xxx.xxx方法 - 输入
...数据 - 出现
...错误
//可在此输入示例代码
期待的正确结果
对您期望发生的结果进行清晰简洁的描述。 反序列化的对象也是BigDecimal
相关日志输出
请复制并粘贴任何相关的日志输出。
附加信息
如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。
这个不是 bug。对于数字类型,在反序列化时 fastjson2 会根据大小自动推断其类型,对于大小在 int 范围内的数字,会将其解析成通用的 Integer 类型;对于范围在 long 内的解析成 Long;超过 long 范围则解析为 BigDecimal。
我觉得这种设计是出于性能和通用性的考虑。在多数场景下,一个整数被当作 Integer 或 Long 处理是最高效的。如果所有数字,无论大小,都默认反序列化成 BigDecimal,会带来不必要的性能开销和内存占用。
至于反序列化时怎样保持 BigDecimal,我觉得目前 GenericFastJsonRedisSerializer#deserialize 中貌似缺少一个重载版本:
public Object deserialize(byte[] bytes, Type type)
GenericFastJsonRedisSerializer我用这个工具进行序列化BigDecimal对象,而且反序列化回去报错,不就是有问题吗,而且我不知道反序列化的类型,public Object deserialize(byte[] bytes, Type type)这个方法也没有意义。 我现在想序列化后,再反序列化类型能匹配,那这个怎么处理
这个设计如此,对于部分
java内置类型如BigDecimal,即使设置了Feature.WriteClassName,序列化时也不会写入类型信息,反序列化时只能自动推断。如果有deserialize(byte[] bytes, Type type)可以在序列化前拿到对象类型,在反序列化时传入即可
我现在反序列化的时候就是不知道里面存的是那种2,不知道这个2该序列化成Integer的2还是BigDecimal
那么问题来了,提供了 WriteLongAsString 然后没有提供 WriteBigDecimal AsString