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

JavaFX笔记本HashMap反序列化异常:数据丢失与键值不匹配

补充说明

我已找到问题根源,它与从JavaFX ComboBox中提取Date的方式有关,同时也因为Java的HashMap是按引用而非按值存储键值对。感谢所有在此过程中提供帮助的人^^


概述

我正在编写一个简单的JavaFX练习项目,实现一个笔记本功能。每条笔记包含日期,内容为字符串,因此笔记本实际是一个HashMap<Date, String>,其中Date是我自行编写的可哈希、可序列化类。笔记本需按需写入文件和从文件加载(使用FileChooser实现)。

问题描述

我可以将笔记本写入文件,随后立即从同一文件读取,但反序列化后的HashMap数据不完整,且部分笔记对应错误的日期。

排查步骤
  1. 我知道HashMap和String已实现Serializable接口,因此只需让Date也实现该接口;以下是该类的代码(不含构造方法和getter/setter):
public class Date implements Serializable {
//    private static final long serialVersionUID = 1L;
    
    public boolean equals(Object other) {
        if (!(other instanceof Date date))
            return false;
        return day == date.day && month == date.month && year == date.year;
    }
    
    public int hashCode() {
        return Objects.hash(day, month, year);
    }
    
    public String toString() {
        return String.format("%02d/%02d/%04d", day, month, year);
    }
}
  1. 确认HashMap<Date, String>可序列化后,我实现了读写文件的逻辑:
public static void loadNotebook(File file) {
        currentFile = file;

        try (FileInputStream fis = new FileInputStream(file);
             ObjectInputStream ois = new ObjectInputStream(fis)) {
            Object deserializedObject = ois.readObject();
            if (deserializedObject instanceof HashMap) {
                currentNotebook = safelyCastObjectToHashMap(deserializedObject);
                System.out.println("Total notes loaded: " + currentNotebook.size());
                return;
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


    public static boolean saveNotebook() {
        try (FileOutputStream fos = new FileOutputStream(currentFile);
             ObjectOutputStream oos = new ObjectOutputStream(fos)) {
            oos.writeObject(currentNotebook);
            System.out.println("Total notes saved: " + currentNotebook.size());
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

说明:currentFile是静态File实例,currentNotebook是静态HashMap<Date, String>。由于应用运行时同一时间仅读写一个笔记本,因此采用了static实现方式。

  1. 如代码所示,我添加了调试日志以排查问题;每次加载/保存文件时,都会记录读写的笔记数量。为调试该问题,我向笔记本添加了3条笔记,保存到文件(调用saveNotebook),随后立即从同一文件读取(通过FileChooser选择文件并调用loadNotebook),结果显示:
Total notes saved: 3
Total notes loaded: 1

说明:添加笔记仅需调用currentNotebook.put(key, value)传入用户提供的日期和字符串。“Total notes saved”日志显示的笔记数量正确,因此我认为问题不在此处。


总结

请问是什么原因导致该问题?我是否遗漏了某些明显的细节?非常感谢您的帮助,无论是解决问题还是优化问题描述:)
我执行了上述所有步骤,原本期望HashMap在序列化和反序列化后保持数据一致,但实际数据丢失且部分键值对应错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 17:47:03