Java 如何使用ObjectOutputStream和ObjectInputStream

Java 如何使用ObjectOutputStream和ObjectInputStream,java,objectoutputstream,Java,Objectoutputstream,详情: 我的课程是一本成绩册,共有5个班级,全部汇总。成绩册有课程,课程有类别,类别有等级(所有ArrayList)。我的程序还有一个StateManager,其唯一目的是由于深度聚合而返回对对象的引用。在我的驱动程序中,我没有创建成绩册的实例,而是创建一个statemanager,它有一个成绩册的静态实例,其中包含返回引用的方法 我的目标是保存所有这些数据,以便在程序重新运行时重新打开 问题: 当我写文件时,我需要做的就是写StateManager对象,对吗?我想我已经做到了。我让程序创建一个

详情:

我的课程是一本成绩册,共有5个班级,全部汇总。成绩册有课程,课程有类别,类别有等级(所有ArrayList)。我的程序还有一个StateManager,其唯一目的是由于深度聚合而返回对对象的引用。在我的驱动程序中,我没有创建成绩册的实例,而是创建一个statemanager,它有一个成绩册的静态实例,其中包含返回引用的方法

我的目标是保存所有这些数据,以便在程序重新运行时重新打开

问题:

当我写文件时,我需要做的就是写StateManager对象,对吗?我想我已经做到了。我让程序创建一个“成绩册.数据”文件。有没有办法在文本程序中打开.data文件并查看它是否正确写入

在哪里使用inputstream再次打开对象?在静态main方法中,还是在初始化所有图形的方法的开头


谢谢

在首次使用程序之前,您需要“尽早”读取程序中某个地方的数据。在您的StateManager的初始化代码中,可以是一个位置


我不明白为什么“初始化所有图形的方法”会是一个合乎逻辑的地方。

在首次使用之前,您需要在程序的“早期”读取某个地方的数据。在您的StateManager的初始化代码中,可以是一个位置


我不明白为什么“初始化所有图形的方法”会是一个合乎逻辑的地方。

不,没有文本编辑器会将所有细节显示为正确的文本格式,因为您所写的是字节,并且您的文本编辑器希望您提供文本

将对象从磁盘加载到内存-两种方法

  • 在主方法中加载它们,如果你不使用它们,你从磁盘加载它们的努力是徒劳的,你使用了内存和CPU,但没有进一步使用它

  • 当您第一次访问它们时加载它们称为延迟加载,因此当您访问StateManager的静态方法时,如果您的对象为null,您将从磁盘加载它们

  • 离题:


    A详细解释序列化。

    不,任何文本编辑器都不会以正确的文本格式向您显示所有详细信息,因为您所写的是字节,并且您的文本编辑器希望您提供文本

    将对象从磁盘加载到内存-两种方法

  • 在主方法中加载它们,如果你不使用它们,你从磁盘加载它们的努力是徒劳的,你使用了内存和CPU,但没有进一步使用它

  • 当您第一次访问它们时加载它们称为延迟加载,因此当您访问StateManager的静态方法时,如果您的对象为null,您将从磁盘加载它们

  • 离题:


    A详细解释序列化。

    序列化
    StateManager
    不会做任何事情,因为您对
    成绩册
    有一个
    静态
    参考。这本身就是一种代码味道,但在这里它会产生无法序列化的物理影响——只有实例字段才能序列化。因此,删除
    静态
    限定符。您可以将
    StateManager
    本身设置为单例,并对其进行
    static
    引用


    然而,我仍然怀疑为什么不序列化
    成绩册
    实例。这将是一种更符合逻辑的方法。我们通常不序列化服务对象,而是数据对象,而您已经有了这种分离。

    序列化
    StateManager
    不会做任何事情,因为您有一个
    静态
    参考
    成绩册。这本身就是一种代码味道,但在这里它会产生无法序列化的物理影响——只有实例字段才能序列化。因此,删除
    静态
    限定符。您可以将
    StateManager
    本身设置为单例,并对其进行
    static
    引用


    然而,我仍然怀疑为什么不序列化
    成绩册
    实例。这将是一种更符合逻辑的方法。我们通常不序列化服务对象,而是数据对象,而您已经有了这种分离。

    Hm。我仍然有问题。下面是我所做的:在驱动程序的顶部,我有我的全局变量,其中包括StateManager。然后变量后面的第一行代码是manager=newstatemanager();然后我有了我的try{ObjectInputStream oin=new ObjectInputStream(new FileInputStream(“gradebook.data”);manager=(StateManager)oin.readObject();}catch(Exception e){System.out.println(e);},如果找到了这个文件(它被创建了,我检查了),我希望是这样做的,它将覆盖并现在引用文件中的对象。不行,嗯。我仍然有问题。下面是我所做的:在驱动程序的顶部,我有我的全局变量,其中包括StateManager。然后变量后面的第一行代码是manager=newstatemanager();然后我有了我的try{ObjectInputStream oin=new ObjectInputStream(new FileInputStream(“gradebook.data”);manager=(StateManager)oin.readObject();}catch(Exception e){System.out.println(e);},如果找到了这个文件(它被创建了,我检查了),我希望是这样做的,它将覆盖并现在引用文件中的对象。这是因为成绩册类本身没有任何内容。StateManager在其类中创建成绩册,然后可以返回其实例以在驱动程序中使用。private static final StateManager=new StateManager();私人成绩册;/***使用新成绩册创建新的StateManager对象。*/public StateManager(){gb=new GradeBook();}如果你在这里发布的是你的真实代码,那么“singleton”是什么意思