1

细节:

我的程序是一本包含 5 个班级的成绩册,这些班级全部汇总。GradeBook 有课程,Course 有 Categories,Category 有 Grades(所有 ArrayList)。我的程序还有一个 StateManager,它的唯一目的是因为深度聚合返回对对象的引用。在我的驱动程序中,我没有创建 GradeBook 的实例,而是创建了一个 statemanager,它有一个 GradeBook 的静态实例以及返回引用的方法。

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

问题:

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

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

谢谢

4

3 回答 3

1

序列化StateManager不会做任何事情,因为您static引用了GradeBook. 这本身就是一种代码异味,但在这里它具有没有被序列化的物理影响——只有实例字段被序列化。所以删除static限定符。您可以将其StateManager本身设为单例并static对其进行引用。

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

于 2012-05-27T18:09:39.313 回答
0

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

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

于 2012-05-27T17:46:28.837 回答
0

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

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

  1. 事先加载它们,从某种意义上说,在 main 方法中加载它们,如果你不使用它们,你从磁盘加载它们的努力是徒劳的,你使用了内存和 CPU,但没有进一步使用它。

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

题外话:

一篇很好的文章,详细解释了序列化。

于 2012-05-27T17:46:52.947 回答