Java 无法添加到已反序列化的自定义生成链接列表中

Java 无法添加到已反序列化的自定义生成链接列表中,java,serialization,io,singly-linked-list,Java,Serialization,Io,Singly Linked List,我制作了一个带有节点对象的单链表,其中包含一个数据变量和一个下一个节点变量。客户对象存储在数据变量中。客户文件包含一个姓氏变量和一个名变量,如下所示: public customer { String Surname; String Forename; get and set methods for each; } 链表和节点类将按姓氏(A-Z)升序排序,以便George Clooney位于Jay Gatsby之前。用于在链表中递归插入项的方法很好,在尝试使用ObjectOutputStrea

我制作了一个带有节点对象的单链表,其中包含一个数据变量和一个下一个节点变量。客户对象存储在数据变量中。客户文件包含一个姓氏变量和一个名变量,如下所示:

public customer
{
String Surname;
String Forename;
get and set methods for each;
}
链表和节点类将按姓氏(A-Z)升序排序,以便George Clooney位于Jay Gatsby之前。用于在链表中递归插入项的方法很好,在尝试使用
ObjectOutputStream
FileOutputStream
保存文件或使用
ObjectInputStream
FileInputStream
加载文件之前,我已经运行了许多测试

作为我所做的所有研究的结果,我得出结论,最好将整个链表保存为一个对象,使用自定义链表(不是标准Java列表)上的可序列化接口将其序列化并保存到文件中

现在,我的问题来了:我添加了一个带有随机姓氏的节点对象,效果很好:每次添加项目时,列表都会从文件中反序列化,并加载到一个新的
SinglyLinkedList
对象中。添加新节点并将其放置在列表中的正确位置,然后使用
ObjectOutputStream
FileOutputStream
将此新列表传递回文件

我加了一项就可以了;但是,如果我添加另一个,它会说它很好(没有错误-我有所有适当的
try
catch
语句),但实际上它不会更新列表。print方法加强了这一点,因为它也以相同的方式访问列表,并且只打印第一项(即使添加了更多)。当我询问列表的长度时,它只会给出第一项(例如返回1)

如果我关闭它并重新运行它,我将再次收到相同的1个节点,仅此而已。那么,如果我再加一个,它就不会再起作用了

以下是一些有用的信息:

  • customer文件、节点和单链表类具有必要的可序列化导入,并实现可序列化头
  • 有4个独立的类,客户文件包含数据,节点包含客户文件和下一个节点,单链表包含编辑列表的所有方法,主类包含所有扫描仪和可序列化流对象(例如ObjectOutputStream),并从键盘获取命令和数据(例如“添加”、“打印”)
  • 有单独的方法保存和加载到文件,用于减少屏幕上的代码覆盖率-这可能是个问题-我是这方面的新手,但下面是代码
在MAIN方法中添加节点的代码-非递归例程

CustomerFile custDat = new CustomerFile(fName,sName); 

            Node custNode = new Node(custDat, null);
            SinglyLinkedList a = loadListFromFile();
            if (a == null)
            {
                System.out.println("Creating new list");
                SinglyLinkedList newList = new SinglyLinkedList();
                newList.addRecord(custNode, null);
                a = newList;
            }
            else
            {
                a.addRecord(a.getHead(), custNode);
            }
            saveListToFile(a);
            System.out.println("File added successfully");
loadListFromFile
方法(保存列表方法类似,但使用的是输出)有一组
fileName

private static SinglyLinkedList loadListFromFile()

{
    SinglyLinkedList lst = null;
    try
    {
        ObjectInputStream is = new ObjectInputStream(new FileInputStream(fileName));
        lst = (SinglyLinkedList) is.readObject();
        is.close();
    }
    catch(FileNotFoundException e)
    {
        e.printStackTrace();
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
    catch(ClassNotFoundException e)
    {
        e.printStackTrace();
    }
    return lst;
}

幸运的是,我已经解决了这个问题!感谢您的帮助,但问题是由于我的逻辑中出现了故障。我运行了一个循环,将值添加到节点,这些节点被添加到列表中,该列表在列表中被声明为新的-即该列表无法到达SaveListFile方法,因此不会添加到l保存在文件中的ist

是本周的主页吗?您是否考虑过其他保存数据的方法?我的意思是,一定有某个地方缺少链接,为什么序列化过程不会触及列表中的第二个节点。在这种情况下,我更愿意经历所有麻烦,使用JSON或其他可读的方法。有e足够的库(如GSON)这可以将Java对象转换为JSON,反之亦然。您可以直接验证输出,因为您存储的是纯文本。或者使用JSON或其他不可能的东西?我可以使用JSON,但这是一个赋值,所以我确实需要使用序列化。值得一提的是,add方法是无效的,因此它只是添加它应用于列表,不是说这会产生影响,是吗?幸运的是,我已经解决了这个问题!谢谢你的帮助,但问题是由于我的逻辑失败。我运行一个循环,获取值并将它们添加到节点,这些节点被添加到列表中,该列表在列表中声明为新的-即列表无法访问saveListToFile方法,因此不会添加到保存在文件中的列表中