fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[BUG] Date类型不带毫秒序列化后可以被反序列化为byte类型

Open RainYuY opened this issue 8 months ago • 4 comments

问题描述

如题

环境信息

请填写以下信息:

  • OS信息: All
  • JDK信息:Openjdk 1.8.0_312
  • 版本信息:2.0.54

重现步骤

如何操作可以重现该问题: 第一个不会报错,第二个会报错 //可在此输入示例代码

        byte[] jsonBytes = JSONB.toBytes(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2025-04-01 12:47:10"),
                JSONWriter.Feature.WriteClassName,
                JSONWriter.Feature.FieldBased,
                JSONWriter.Feature.ErrorOnNoneSerializable,
                JSONWriter.Feature.ReferenceDetection,
                JSONWriter.Feature.WriteNulls,
                JSONWriter.Feature.NotWriteDefaultValue,
                JSONWriter.Feature.NotWriteHashMapArrayListClassName,
                JSONWriter.Feature.WriteNameAsSymbol);
        JSONB.parseObject(jsonBytes, byte.class,
                JSONReader.Feature.UseDefaultConstructorAsPossible,
                JSONReader.Feature.ErrorOnNoneSerializable,
                JSONReader.Feature.IgnoreAutoTypeNotMatch,
                JSONReader.Feature.UseNativeObject,
                JSONReader.Feature.FieldBased);
        jsonBytes = JSONB.toBytes(new Date(),
                JSONWriter.Feature.WriteClassName,
                JSONWriter.Feature.FieldBased,
                JSONWriter.Feature.ErrorOnNoneSerializable,
                JSONWriter.Feature.ReferenceDetection,
                JSONWriter.Feature.WriteNulls,
                JSONWriter.Feature.NotWriteDefaultValue,
                JSONWriter.Feature.NotWriteHashMapArrayListClassName,
                JSONWriter.Feature.WriteNameAsSymbol);
        JSONB.parseObject(jsonBytes, byte.class,
                JSONReader.Feature.UseDefaultConstructorAsPossible,
                JSONReader.Feature.ErrorOnNoneSerializable,
                JSONReader.Feature.IgnoreAutoTypeNotMatch,
                JSONReader.Feature.UseNativeObject,
                JSONReader.Feature.FieldBased);

期待的正确结果

报错,无法序列化

相关日志输出

附加信息

RainYuY avatar Apr 01 '25 09:04 RainYuY

https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson2/fastjson2/2.0.58-SNAPSHOT/ 问题已修复,请帮忙用2.0.58-SNAPSHOT版本验证,2.0.58版本预计在5月初发布。

能介绍为什么有这个问题么?

wenshao avatar Apr 02 '25 00:04 wenshao

https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson2/fastjson2/2.0.58-SNAPSHOT/ 问题已修复,请帮忙用2.0.58-SNAPSHOT版本验证,2.0.58版本预计在5月初发布。

能介绍为什么有这个问题么?

因为dubbo的fastjson2单元测试会偶发断言失败,断言反序列化Date序列化结果到Byte类型异常,偶然发现有时断言失败,并没有抛异常,所以debug看了一下,发现new Date取到的时间恰好毫秒数为0时,序列化的结果都能反序列化为byte类型

zrlw avatar Apr 02 '25 01:04 zrlw

我看了一下 support readMillis as int32 (https://github.com/alibaba/fastjson2/commit/f5c0b6287e2c27c3e185f49fe959403a76bc7f45) 那么是否可以确认fastjson2允许将Date类型的序列化串反序列化为Byte?我看ObjectReaderImplByte#readJSONBObject是先获取int32,再将int32的byteValue值作为返回值(取int32最后一个字节)?

zrlw avatar Apr 02 '25 01:04 zrlw

https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson2/fastjson2/2.0.58-SNAPSHOT/ 问题已修复,请帮忙用2.0.58-SNAPSHOT版本验证,2.0.58版本预计在5月初发布。

能介绍为什么有这个问题么?

我的意思其实是,在FastJson的设计里面,按道理时间类型应该不能转为byte才对,我希望这两个testcase都会失败,而不是一个成功一个失败

RainYuY avatar Apr 02 '25 03:04 RainYuY

是测试遇到这个问题么?还是业务场景有这个问题?

wenshao avatar Jul 27 '25 10:07 wenshao

是测试遇到这个问题么?还是业务场景有这个问题?

只是在编写转换结果类型与预期类型不一致的异常测试案例用到了,以为date类型肯定转不了byte类型,预期是抛异常,测试结果却是偶尔可以转成功。 日期类型可以转byte(丢失超过byte范围的数据)是主流json工具的做法么?

zrlw avatar Jul 27 '25 14:07 zrlw

https://github.com/alibaba/fastjson2/releases/tag/2.0.58 问题已修复,请用新版本

wenshao avatar Jul 30 '25 05:07 wenshao