JavaFX笔记本HashMap反序列化异常:数据丢失与键值不匹配
补充说明
我已找到问题根源,它与从JavaFX ComboBox中提取Date的方式有关,同时也因为Java的HashMap是按引用而非按值存储键值对。感谢所有在此过程中提供帮助的人^^
概述
我正在编写一个简单的JavaFX练习项目,实现一个笔记本功能。每条笔记包含日期,内容为字符串,因此笔记本实际是一个HashMap<Date, String>,其中Date是我自行编写的可哈希、可序列化类。笔记本需按需写入文件和从文件加载(使用FileChooser实现)。
问题描述
我可以将笔记本写入文件,随后立即从同一文件读取,但反序列化后的HashMap数据不完整,且部分笔记对应错误的日期。
排查步骤
- 我知道
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); } }
- 确认
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实现方式。
- 如代码所示,我添加了调试日志以排查问题;每次加载/保存文件时,都会记录读写的笔记数量。为调试该问题,我向笔记本添加了3条笔记,保存到文件(调用
saveNotebook),随后立即从同一文件读取(通过FileChooser选择文件并调用loadNotebook),结果显示:
Total notes saved: 3 Total notes loaded: 1
说明:添加笔记仅需调用
currentNotebook.put(key, value)传入用户提供的日期和字符串。“Total notes saved”日志显示的笔记数量正确,因此我认为问题不在此处。
总结
请问是什么原因导致该问题?我是否遗漏了某些明显的细节?非常感谢您的帮助,无论是解决问题还是优化问题描述:)
我执行了上述所有步骤,原本期望HashMap在序列化和反序列化后保持数据一致,但实际数据丢失且部分键值对应错误。
内容的提问来源于stack exchange,提问作者Yoni
相关产品推荐
相关产品推荐

