C++Boost对象序列化-定期保存以保护数据

C++ Boost Object Serialization - Periodic Saving to Protect Data

本文关键字:保存 保护 数据 对象 序列化 C++Boost      更新时间:2023-10-16

我有一个程序,它使用boost序列化,在程序启动时加载,在关闭时保存。

每隔一段时间,程序就会因为这个或那个而崩溃,我希望这是相当正常的。问题是,当程序崩溃时,通常根本不保存对象。其他时候,一些会丢失或数据会损坏。如果用户丢失了数月又数月的数据,这可能是灾难性的。在一个完美的世界里,每个人都会备份他们的数据,他们可以回滚数据文件。

我的第一个解决方案是在运行时定期将对象保存到不同的临时数据文件中。这样,如果程序崩溃,他们可以恢复到临时数据文件,数据损失最小。我关心的是对表现的影响。据我所知(如果我错了,请纠正我),一旦你保存了一个对象,它就不能再使用了?如果是这种情况,那么定期保存例程将包括保存和删除我的指针,然后再次加载它们。

我的第二个解决方案是在程序启动期间简单地复制数据文件。用户的数据丢失将仅限于该会话。但是,这可能还不够,因为有些用户可能会连续几天运行该程序。

任何意见都将不胜感激。

提前谢谢。

如果使用boost序列化保存对象图,则该对象图仍然可用,并且可以再次保存,而不必从磁盘读取任何内容。

如果你想发展高科技并引入更多的复杂性,你可以使用带有managed_shared_memory段的Boost进程间库。这使您能够真正透明地直接在磁盘文件上工作(实际上,在由文件块支持的内存页上)。实际上,这引入了另一个问题:如何防止更改频繁影响磁盘。

无偿建议:

我认为最好的情况是,如果你的对象图是(例如)一个所有节点都是共享免疫的复合模式。现在序列化是"免费的"(使用Boost),您可以轻松地处理程序状态的多个版本(逻辑上通常是"文档"或"数据库"),并使用Boost序列化有效地保存/加载它们。此模式有助于撤消/重做、并发操作、事务提交等。


cco(!并非没有额外的工作,但原则上)