jmeter-plugins-for-apache-dubbo icon indicating copy to clipboard operation
jmeter-plugins-for-apache-dubbo copied to clipboard

gson导致long类型序列化后类型为double类型

Open zhuangjinjin opened this issue 3 years ago • 3 comments

我dubbo接口暴露的接口参数带有Long类型,通过jmeter-plugins-for-apache-dubbo发起测试,而dubbo provider端收到的参数long值和发送端的值不一致,追踪代码发现jmeter-plugins-for-apache-dubbo采用gson作为序列化工具,而gson在对int和long类型的值做序列化时,会统一把它们当成double处理,导致精度受损问题

zhuangjinjin avatar Jul 28 '20 15:07 zhuangjinjin

@zhuangjinjin 是独立的long类型参数?还是参数对象中一个long类型的属性?

ningyu1 avatar Aug 04 '20 04:08 ningyu1

@ningyu1 参数对象中一个long类型的属性

zhuangjinjin avatar Aug 04 '20 05:08 zhuangjinjin

@zhuangjinjin 这个问题可以先规避。 规避的方法,把参数类所在的jar(api-jar)包放入jmeter classpath,插件在反序列化时会优先去classpath下寻找,如果找到了直接用明确类型反序列化,这样Long类型是不会变成double的(科学计数)。如果在classpath没有找到会使用Map通用格式反序列化,只有使用通用Map格式时才会将数字类型转换成double。

反序列化为通用Map示例:

HashMap<String, Object> newTest = new HashMap<>();
newTest.put("first", 6906764140092371368L);
String jsonString = JsonUtils.toJson(newTest);
System.out.println(jsonString); // output ok: {"first":6906764140092371368}
Map<String, Object> mapFromJson = JsonUtils.formJson(jsonString, Map.class);
System.out.println(mapFromJson.get("first")); // output ok: {Double@1036} 6.9067641400923709E18

相同问题:https://github.com/google/gson/issues/1084 后续想办法解决掉

ningyu1 avatar Aug 20 '20 07:08 ningyu1