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

时间:2013-01-22 18:02:33

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

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

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

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

我添加记录并修改列表 - 随着其他类的工作变得简单易行 - 一旦添加了这些记录,我就会调用print函数,它只显示列表中的所有项目,并且很好。

然而,当我关闭环境时,它们会丢失,当我重新打开环境再次查看列表时,它是空的!

在查看保存这些类的文件夹时,我注意到每次运行程序时都会创建'shells'并保持在那里直到程序关闭/完成,但是'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();
    }
}

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

有什么建议吗?

P.S。我的主要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行代码(很多方法)。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我已经解决了,而不是发布我的代码,我试图自己做。我发现列表类有一些静态方法 - 这些方法已更改为非静态方法,现在列表每次都按预期方式保存。 谢谢你的帮助