我有一个使用 boost 序列化的程序,它在程序启动时加载并在关闭时保存。
每隔一段时间,程序就会因为这个或那个而崩溃,我希望这是相当正常的。问题是当程序崩溃时,对象往往根本没有保存。其他时候,有些会丢失或数据会损坏。如果用户丢失数月又数月的数据,这可能是灾难性的。在一个完美的世界里,每个人都会备份他们的数据,他们可以回滚数据文件。
我的第一个解决方案是在运行时定期将对象保存到不同的临时数据文件中。这样,如果程序崩溃,他们可以恢复到临时数据文件,而数据丢失最少。我担心的是对性能的影响。据我了解(如果我错了请纠正我),一旦你保存了一个对象,它就不能再使用了吗?如果是这种情况,那么定期保存例程将涉及保存和删除我的指针,然后再次加载它们。
我的第二个解决方案是在程序启动期间简单地复制数据文件。用户的数据丢失将仅限于该 session 。但是,这可能还不够,因为某些用户可能会连续几天运行该程序。
如有任何意见,我们将不胜感激。
提前致谢。
最佳答案
如果您使用 boost 序列化保存一个对象图,该对象图仍然可用并且可以再次保存而不必从磁盘读取任何内容。
如果你想要高科技并引入更多的复杂性,你可以使用带有 managed_shared_memory
段的 Boost Interprocess 库。这使您能够真正透明地直接在磁盘文件上工作(实际上,在由文件 block 支持的内存页面上)。这实际上引入了另一个问题:如何防止更改频繁写入磁盘。
无偿建议:
我认为如果您的对象图是(例如)Composite pattern,那将是世界上最好的。所有节点都是共享的不可变对象(immutable对象)。现在序列化是“免费的”(使用 Boost),您可以轻松处理程序状态的多个版本(逻辑上通常是“文档”或“数据库”)并使用 Boost 序列化有效地保存/加载它们。这种模式有助于撤消/重做、并发操作、事务性提交¹等。
¹(!并非没有额外的工作,但原则上)
关于C++ Boost 对象序列化 - 定期保存以保护数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23120066/