You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java序列化HashMap<UUID,ArrayList<String>>时无报错但文件未写入内容

问题排查和解决方案

1. 优先排查:是否误判文件内容为空

序列化后的文件是二进制格式,直接用普通文本编辑器(比如Windows记事本、部分轻量编辑器)打开时,因为包含大量不可打印的二进制字符,会显示为空白内容,属于正常现象。
你可以先查看文件的属性确认文件大小:

  • 如果文件大小大于0,说明写入操作已经成功,只是查看方式不对,用反序列化代码即可读回内容。
  • 如果文件大小确实为0,再继续往下排查。

2. 主动刷入缓冲区避免IO缓存问题

虽然ObjectOutputStream的close()方法默认会触发flush操作,但部分特殊文件系统/IO场景下可能存在缓冲区未写入的问题,可以在writeObject之后主动调用flush:

oos.writeObject(serializable);
oos.flush(); // 新增主动刷入
oos.close();
fos.close();

3. 确认查看的文件和实际写入路径一致

如果使用相对路径创建File对象,不同运行环境的工作目录可能不同,会导致你查看的是其他目录下旧的空文件,和实际写入的文件不是同一个。
可以直接打印file.getAbsolutePath()输出绝对路径,按这个路径去找文件,避免路径混淆。

4. 多线程操作导致的内容丢失

如果序列化操作和其他修改HashMap的操作在并发执行,可能存在执行writeObject时恰好被其他线程清空了HashMap,之后其他线程又恢复了内容,导致你打印的对象看起来有内容,但实际写入的是空对象。可以加锁保证序列化期间HashMap不会被修改。

验证方法

可以在序列化完成后立刻加一段反序列化代码,直接验证写入的文件是否有效:

try {
    FileInputStream fis = new FileInputStream(file.getAbsolutePath());
    ObjectInputStream ois = new ObjectInputStream(fis);
    HashMap<UUID, ArrayList<String>> readMap = (HashMap<UUID, ArrayList<String>>) ois.readObject();
    System.out.println("反序列化得到的Map大小:" + readMap.size());
    System.out.println("反序列化得到的Map内容:" + readMap);
    ois.close();
    fis.close();
} catch (Exception e) {
    e.printStackTrace();
}

如果这段代码可以正常输出你写入的Map内容,说明序列化操作完全正常,不需要调整代码。

内容的提问来源于stack exchange,提问作者1Mangomaster1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:18:05