问题总结:Map存入的数据丢失类型任意

发现问题:Map存入的数据丢失类型

经常会使用 Map<String,Object> 来用于存储键值对的数据,由于我们使用 Object 类型来接收数字,但是有些时候会出现map并不知道我们传入的是 Long 还是 Integer 。也就是出现数据类型丢失的问题

接下来尝试复现bug:

  1. 准备一个Map<String,Object> ,并将Long对象存入
  2. 取出该Long对象,并用instance of 判断该对象类型
    • 经过测试发现,正常的存取并不会出现该问题是正常的情况
  3. 尝试使用JSON将map序列化,转换后进行测试
    • 测试发现,BUG成功复现了,数据类型丢失了,Long类型被降级为INT

测试的Demo代码如下:

package com.test;

import com.alibaba.fastjson.JSON;

import java.util.HashMap;
import java.util.Map;

public class TestMain {

    public static void main(String[] args) {
        Map<String , Object> map = new HashMap<>();
        Long dataLong = 123456L;
        map.put("test",dataLong);
        System.out.println(JSON.toJSONString(map));
        Object test = map.get("test");
        System.out.println("测试一下正常使用map,是否会导致存入了Long类型丢失转换为int:");
        System.out.println(test instanceof Integer);

        // ========


        Object mapp = JSON.parse(JSON.toJSONString(map));
        Map<String , Object> objectMap = (Map<String , Object>) mapp;
        System.out.println(objectMap.toString());
        Object objectTest = objectMap.get("test");
        System.out.println("序列化存储map,是否会导致存入了Long类型丢失转换为int:");
        System.out.println(objectTest instanceof Integer);

    }
}

输出结果如下:

image-20230223214504915

问题分析

不难发现,两次的map其实对应的JSON字符串样式的一直的,但是在从字符串转换为map时丢失了数据类型。

在进行转换时, Map 会根据我们传入的数值的大小来判断。也就是说如果你传入的数值的大小是在Integer.MIN_VALUE、 Integer.MAX_VALUE 之间,Map 就认为是 Integer 类型,如果超过了这个范围就认为是 Long 类型。

在实际开发中,还挺经常遇到这种情况的,开发初期理所当然的当成int类型处理和转换,会随着数据位数的增加在中后期就报错,到时候属于是隐性BUG了。

要解决也很简单,需要我们对数据类型的转换熟悉再熟悉。

问题解决

解决的思路很简单,就是确保无论map中提取到的对象是int还是long或其他,都要统一转换为我们想要的long类型,在做处理的时候就是**将这个对象也先序列化,再转换,**这样就可以确保数据类型不会丢失,达到预期。

// 不直接强转先用 Object 接收
Object number = map.get("number");
// 下面两种二选一
Long longNumber = Long.valueOf(number.toString());
Long longNumber = Long.valueOf(String.valueOf(number));

思考:数据类型转换

顺便整理复习一下知识点

1. 包装类型不能直接强转
// 强转会报如下错误
// class java.lang.Integer cannot be cast to class java.lang.Long 
Integer number = 10;
// 这样的强转是不对的
Long number2 = (Long)number;
2. 正确的转换方式
基本数据类型之间的转换
// int 转 long
int a = 10;
long b = (long)a;
// long 转 int
long a = 10L;
int b = (int)a;
包装类型之间的转换
Integer a = 10;
Long b = a.longValue();
// Long 转 Integer
Long a = 10L;
Integer b = a.intValue();
// 或者
Long a = 10L;
Integer b = Math.toIntExact(a);

参考博客:原博写的不错

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
数据恢复报告全文共5页,当前为第1页。数据恢复报告全文共5页,当前为第1页。初检报告 数据恢复报告全文共5页,当前为第1页。 数据恢复报告全文共5页,当前为第1页。 1、用户信息 单位名称 XXXXX客服中心 单位地址 XXXXXXXXXXX 客户姓名 邹XX 联系电话 139XXXXXXXX 手机 139XXXXXXXX E-Mail 2、报修清单及基本描述 设备品牌 华为 设备型号 RAID级别 Raid5 LUN分配 8TB 主机操作系统 Linux 分区类型 Ext3 存储介质清单 华为存储 故障描述 Ext3文件系统中丢失部分音频文件 期望恢复目的 丢失的音频数据 介质附图说明 数据恢复报告全文共5页,当前为第2页。数据恢复报告全文共5页,当前为第2页。 数据恢复报告全文共5页,当前为第2页。 数据恢复报告全文共5页,当前为第2页。 3、项目成员 项目成员联系方式: 工程师 姓名 电话 邮箱 项目主管 李XX 159XXXXXXXX XXXXXX 程序开发工程师 邓X 185XXXXXXXX XXXXXX 商务工程师 张XX 010-XXXXXX-XXX 185XXXXXXXX XXXXXX 文件工程师 张X 185XXXXXXXX XXXXXX 文件系统开发工程师 王X 185XXXXXXXX XXXXXXX 音频/视频研发工程师 刘XX 185XXXXXXXXX XXXXXX 音频/视频开发工程师 秦XX 185XXXXXXXX XXXXXXX 流程跟踪工程师 张X 185XXXXXXXXX XXXXXXXXX 各自职能: 项目主管:负责每一步流程审核,项目协调,方案制定。 商务工程师:负责反馈消息给用户 实施工程师:负责技术实现 初检过程及结论 初检过程: 数据恢复报告全文共5页,当前为第3页。数据恢复报告全文共5页,当前为第3页。据电话初检可知,丢失数据为音频格式文件,文件系统为Ext3,数据丢失后没有再做其他操作。 数据恢复报告全文共5页,当前为第3页。 数据恢复报告全文共5页,当前为第3页。 初检结论: 因Ext3文件系统中删除数据后,其文件的名称及目录结构均无法还原,但据电话沟通得知,此次丢失数据为音频文件,且有数据库记录文件路径,因此,几乎可还原所有的目录结构及文件名称。 服务方案 1、商务流程 1、签订数据安全救援服务协议、保密协议。 2、实施数据安全救援工作(见技术流程)。 3、进行数据验收 A、验收成功: 客户签字确认; 在约定周期内,完成付款及开具发票流程。 提供后续数据保管、服务跟踪及技术咨询服务。 B、验收不成功,销毁中转数据及已恢复数据,移交设备。 2、技术流程 1、前期备份流程 A、将存储以只读模式映射给备份服务器。 B、使用dd,Winhex等专业备份工具将映射到备份服务器中的数据做全部镜像。 数据恢复报告全文共5页,当前为第4页。数据恢复报告全文共5页,当前为第4页。D、做完全部镜像后,将所有存储配置及链路还原至初始状态,之后数据恢复操作均不对原始硬盘做任何操作 数据恢复报告全文共5页,当前为第4页。 数据恢复报告全文共5页,当前为第4页。 2、分析Ext3文件系统 A、对已备份的数据进行底层二进制数据分析,并统计数据在整个存储空间中的分布情况。 B、分析Ext3文件系统,利用自主开发的文件系统解析程序,对已备份的数据进行文件系统解析。 C、分析丢失数据的节点,数据MAP,并统计整个文件系统的自由空间。 3、分析音频文件结构/开发恢复程序 分析音频文件结构,并统计音频文件的特殊标识以及时间戳。 编写符合规定时间范围的音频文件扫描程序,并对备份的数据进行全部扫描/统计。 根据现有音频文件的时间戳及命名规则,推测已恢复文件的原有文件名称。 根据管理数据库中记录的文件名称及路径,最大程度还原所有目录结构。 根据上述流程编写相对应模块的程序,批量生成数据并最大程度还原目录结构。 4、数据验证 A、由用户主导对数据本身进行详细验证。 B、如发现新问题,重新检验上述所有恢复过程。 3、服务承诺 1、整个过程不会对客户的原盘有任何的写操作,以确保原盘的数据安全 2、尽最大可能保证服务的操作可逆,确保人力可控范围内操作可回溯。 数据恢复报告全文共5页,当前为第5页。数据恢复报告全文共5页,当前为第5页。3、数据安全救援不成功不收费。 数据恢复报告全文共5页,当前为第5页。 数据恢复报告全文共5页,当前为第5页。 4、提供后期数据保管和服务跟踪。 周期预估 状态 所需时间 镜像环境准备 约4小时 镜像 约100G/每小时 分析数据 约1天 恢复数据 约2天 验证数据 约1天 说明:总时间控制在3~5天内,上表中的时间只是预估,本服务以全加急模式进行,24小时加班加急处理,完成周期以实际情况为准

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xcong_Zhu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值