类似于hibernate的程序保存状态

时间:2013-02-28 01:02:52

标签: c++ memory

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

saveState(file);

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

5 个答案:

答案 0 :(得分:2)

您最想要的是我们称之为serialization或对象marshalling的内容。数据/对象序列化存在严重的学术问题,您可以轻松地进行谷歌搜索。

如果说正确的库(可能是非常原生的),你可以像运行程序特定的hibernate一样,对你正在运行的程序做一个真正的快照。以下是在Linux上执行该操作的答案:https://stackoverflow.com/a/12190830/318174

要执行上述快照,尽管您很可能需要从要保存的进程中获取外部进程。我强烈建议你不要那样做。而是以您选择的语言进行阅读/查找(顺便说一下,不要标记每种语言......让人们失望)如何做serialization或对象{{3} } ...提示......这些天大多数人选择JSON。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

围绕这个有几个框架。如果您需要Java,Python和C ++的支持,请查看Google协议缓冲区https://developers.google.com/protocol-buffers/我在某些项目中使用它并且运行良好。

还有Thrift(或者来自Facebook)http://thrift.apache.org/我对此没有任何经验。

另一个选择是@QuentinUK建议的。使用从可流动的东西继承和/或制作可流式操作符/函数的类。

我使用框架。

答案 3 :(得分:1)

这是你的问题:

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

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

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

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

答案 4 :(得分:0)

是的,从可流式类派生对象并添加流功能。然后,您可以将所有内容传输到磁盘你需要一个这样的库,比如MFC。