[BUG] Date类型不带毫秒序列化后可以被反序列化为byte类型
问题描述
如题
环境信息
请填写以下信息:
- 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);
期待的正确结果
报错,无法序列化
相关日志输出
附加信息
https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson2/fastjson2/2.0.58-SNAPSHOT/ 问题已修复,请帮忙用2.0.58-SNAPSHOT版本验证,2.0.58版本预计在5月初发布。
能介绍为什么有这个问题么?
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类型
我看了一下 support readMillis as int32 (https://github.com/alibaba/fastjson2/commit/f5c0b6287e2c27c3e185f49fe959403a76bc7f45) 那么是否可以确认fastjson2允许将Date类型的序列化串反序列化为Byte?我看ObjectReaderImplByte#readJSONBObject是先获取int32,再将int32的byteValue值作为返回值(取int32最后一个字节)?
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都会失败,而不是一个成功一个失败
是测试遇到这个问题么?还是业务场景有这个问题?
是测试遇到这个问题么?还是业务场景有这个问题?
只是在编写转换结果类型与预期类型不一致的异常测试案例用到了,以为date类型肯定转不了byte类型,预期是抛异常,测试结果却是偶尔可以转成功。 日期类型可以转byte(丢失超过byte范围的数据)是主流json工具的做法么?
https://github.com/alibaba/fastjson2/releases/tag/2.0.58 问题已修复,请用新版本