3

在 C++ 或 Java 或 Python 中是否有任何方法可以让我保存程序的状态,不问任何问题?例如,我花了一个小时学习如何将树状结构保存到文件中。很有教育意义,但我觉得我可以这样做:

saveState(file);

“文件”将包含我的程序使用的整个内存。就像操作系统的“休眠”或“挂起到磁盘”功能一样。我知道提升序列化,这可能不是我想要的。

4

5 回答 5

2

您最可能想要的是我们所说的序列化或对象编组。数据/对象序列化有一大堆学术问题,你可以很容易地用谷歌搜索。

话虽这么说,给定正确的库(可能非常原生),您可以像“特定于操作系统的休眠”一样对正在运行的程序进行真实快照。这是在 Linux 上执行此操作的 SO 答案:https ://stackoverflow.com/a/12190830/318174

要进行上述快照,您很可能需要来自要保存的进程的外部进程。我强烈建议你不要那样做。而是以您选择的语言阅读/查找(顺便说一句,欢迎使用 SO,不要标记每种语言......这会让人们生气)如何进行序列化或对象编组......提示......现在大多数人都选择 JSON。

于 2013-02-28T13:33:43.740 回答
1

围绕这个有几个框架。如果您需要对 Java、Python 和 C++ 的支持,请查看 Google Protocol Buffers https://developers.google.com/protocol-buffers/ 我在一些项目中使用过它并且效果很好。

还有 Thrift(最初来自 Facebook) http://thrift.apache.org/ 虽然我没有任何经验。

另一种选择是@QuentinUK 建议的。使用继承自可流式传输的类和/或制作可流式操作符/函数的类。

我会使用一个框架。

于 2013-02-28T02:41:20.897 回答
1

我认为您所描述的将是很少有人真正想将其用于真实系统的功能。通常你想保存一些东西以便它可以传输,或者你可以停止运行程序,或者防止程序退出(或电源故障)的可能性。

在大多数生产系统中,人们希望对磁盘的写入小而增量,以便系统可以保持响应,并且可以避免写入不一致的数据。定期将所有内存写入磁盘可能会导致大量无响应时间。您需要锁定整个系统以避免不一致的状态。

但是,编写自己的持久性很乏味且容易出错,因此您可能会发现这个 SO 问题很有趣:Persisting graph data (Java)

于 2013-02-28T01:22:54.150 回答
1

这是你的问题:

回到古代历史(带有扩展器的 16 位 DOS 程序),编译器曾经支持存储相对地址的“基于”指针。这些可以安全地批量序列化。应用程序这样做了,保存了代码和数据,序列化的模块被称为“覆盖”。

今天,您需要在工具链中提供基于指针的支持(导致每次指针访问都需要额外调整),或者遍历所有数据,将指针与其他数据区分开来(如何?)并将它们调整为新的存储位置,以防操作系统已经在旧程序用于其堆的同一地址加载了一些库。在现代“托管”环境中,已经必须为垃圾收集器识别指针,即使不经常这样做也是可行的。在本机代码中,这非常困难,尽管创建元数据是为了启用共享库的重定位。

因此,人们最终会手动遍历他们的整个数据结构,并将对象链接(指针)转换为可以在另一端恢复的东西,即使对象有一个新地址(同样,因为旧地址可能已用于共享库)。

请注意,许多处理器具有支持基于寻址的功能......并且由于基于寻址不再常见,编译器继续使用这些指针算术功能来加速用户代码。

于 2013-02-28T02:48:28.043 回答
0

是的,从流式类派生对象并添加流式处理函数。然后,您可以将所有内容流式传输到磁盘。为此,您将需要一个库,例如 MFC。

于 2013-02-28T01:22:40.357 回答