IIWAB Long 类型序列化规则,数值超过 2^53-1,在 JS 会出现精度丢失问题 - IIWAB

Long 类型序列化规则,数值超过 2^53-1,在 JS 会出现精度丢失问题

IIWAB 7月前 ⋅ 301 阅读

‌Long类型数据在序列化时,若数值超过JavaScript的Number类型最大安全整数2^53-1,会导致精度丢失‌。为解决这个问题,可以采取以下几种方法:

‌使用注解转换类型‌:

在Java后端,可以使用Jackson库的@JsonSerialize或@JsonFormat注解,将Long类型的字段在序列化为JSON时转换为String类型,避免精度丢失‌。

声明一个配置类
添加如下配置
public void initMapper(List<ObjectMapper> objectMappers) {
//其他配置项
// 1.1 创建 SimpleModule 对象
        SimpleModule simpleModule = new SimpleModule();
        simpleModule
                // 新增 Long 类型序列化规则,数值超过 2^53-1,在 JS 会出现精度丢失问题,因此 Long 自动序列化为字符串类型
                .addSerializer(Long.class, NumberSerializer.INSTANCE)
                .addSerializer(Long.TYPE, NumberSerializer.INSTANCE)
              
        // 1.2 注册到 objectMapper
        objectMappers.forEach(objectMapper -> objectMapper.registerModule(simpleModule));
        
}

‌全局处理‌:

配置Jackson的ObjectMapper,将所有Long类型的数据都转换为字符串类型,这是一种通用的方法‌。

‌自定义序列化和反序列化‌:

通过在类中添加writeObject和readObject方法,自定义属性的序列化和反序列化逻辑,指定使用String类型进行序列化‌。

这些方法可以有效避免Long类型数据在前端JavaScript中的精度丢失问题‌。


全部评论: 0

    我有话说: