java - 序列化不适用于自定义链表

标签 java serialization io try-catch singly-linked-list

所以这是我的问题: 对于一个项目,我必须创建一个自定义链表,我必须向其中添加节点并使用序列化将其保存到磁盘或从磁盘加载 在定义问题之前,这里有一些关于我的系统的信息

  • 我有一个通用的“客户文件”,用作节点数据
  • 它存储在充当列表元素的节点对象中
  • 有一个客户文件类,其中存储了姓名和电子邮件地址等信息以及每种信息的各种获取和设置方法 - 这些工作正常
  • 有一个节点类,其中包含获取和设置数据以及每个方法的下一个方法,其中下一个项目是一个节点对象并充当列表中的下一个项目
  • 有一个单链接类,具有添加、删除、修改、排序、搜索等方法 - 它是一个定制类,因此不实现任何 JAVA 预制列表。
  • 对所有类分别进行了大量测试并一起使用 - 这些方法是万无一失的 - 它们有效
  • 有一个主类,用于用户和系统之间的主界面 - 它是一个 CLI 系统(命令行)
  • 它有一个将列表保存到文件的函数和从文件加载列表的函数(在主类中),其中每个函数使用序列化或反序列化来从磁盘保存/加载列表
  • 所有类都实现可序列化接口(interface)
  • 主类中有一个“MAIN”方法,其中 while 循环运行,允许用户以某种方式修改列表(例如添加记录、删除记录等...)
  • 该列表是在循环外部加载的,因此每次循环迭代时它都不会被清除(这是同事中的常见问题)
  • 我有一个系统密码,使用相同的方法将字符串保存到另一个文件位置,并且已经工作了数周 - 密码保存在该位置,可以随意访问、更改和删除
  • 这些加载/保存方法具有适当的 try/catch 方法来捕获任何异常

问题是,每次我加载编程环境并想要查看列表时,我都会发现文件列表是“空的”,并且不包含我上次添加/删除内容时的记录。

我添加记录并修改列表 - 与其他类工作一样简单 - 添加这些记录后,我调用打印函数,它只显示列表中的所有项目,就可以了。

但是,当我关闭环境的那一刻,它们就丢失了,当我重新打开环境再次查看列表时,它是空的!

在查看保存这些类的文件夹时,我注意到每次运行程序时都会创建“shell”并保留在那里,直到程序关闭/完成,但是“listData.ser”应该具有保存的链表没有任何数据。

同样,密码文件包含保存完好的密码 - 所以我有点困惑为什么我的代码不起作用。

这是我的保存列表方法:

private static void saveListToFile(SinglyLinkedList lst) {
    try {
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("ListData.ser"));
        os.writeObject(lst);
        os.flush();
        os.close();
    } 

    catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    catch (IOException e) {
        e.printStackTrace();
    }
}

同样,加载列表方法类似,但使用对象输入流和文件输入流。

有什么建议吗?

附注我的主 while 循环有超过 400 行代码长,因此无法发布。

更新1。 加载列表方法中的反序列化代码:

private static SinglyLinkedList loadListFromFile() {
    SinglyLinkedList lst = null;

    try {
        ObjectInputStream is = new ObjectInputStream(new FileInputStream("ListData.ser"));
        lst = (SinglyLinkedList) is.readObject();
        is.close();
    }

    catch(FileNotFoundException e) {
        e.printStackTrace();
    }

    catch(IOException e) {
        e.printStackTrace();
    }

    catch(ClassNotFoundException e) {
        e.printStackTrace();
    }

    return lst;
}

我不认为单链表类本身是问题(回复评论),而且复制也不可行,因为它也有超过 300 行代码(很多方法)。

最佳答案

当您写完文件/对象时,您是否尝试过在 FileOutputStream 上调用 close()

关于java - 序列化不适用于自定义链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14465095/

相关文章:

java - 自定义 Jackson 映射器来处理单个字段的映射?

python - 无需 MS Excel 将 dbf 转换为 csv

javascript - 从任意行 X 开始读取超长文件的最快方法

java - 如何在 J2ME 中实现 session 变量?

java - Repaint() 不在 Java 中调用 paint()

java - Maven2 junit 超时注释不起作用

c++ - 为什么我得到 "double free or corruption"?

java - 严格按顺序执行两个独立的线程

c++ - Boost序列化多个对象

c++ - 为什么我的重命名文件不起作用?