2014-04-16 46 views
0

我有一個使用boost序列化的程序,該程序在程序啓動時加載並在關閉時保存。C++ Boost對象序列化 - 定期保存以保護數據

每隔一段時間,程序都會因這個或那個原因而崩潰,我認爲這是相當正常的。問題是,當程序崩潰時,通常這些對象根本不會被保存。其他時候,有些將會丟失或數據將被損壞。如果用戶丟失數月和數月的數據,這可能是災難性的。在一個完美的世界中,每個人都會備份他們的數據,並且他們可以回滾數據文件。

我的第一個解決方案是在運行期間定期將對象保存到不同的臨時數據文件中。這樣,如果程序崩潰,他們可以以最小的數據丟失恢復到臨時數據文件。我關心的是對績效的影響。據我瞭解(糾正我,如果我錯了),一旦你保存一個對象,它不能再被使用?如果是這種情況,那麼定期保存例程將涉及保存和刪除我的指針,然後再次加載它們。

我的第二個解決方案是在程序啓動時簡單複製數據文件。用戶的數據丟失將限於該會話。但是,這可能還不夠,因爲有些用戶可能會在幾天或幾天內運行該程序。

任何輸入,將不勝感激。

在此先感謝。

+0

「_once您保存對象,它可以不再使用_「你在哪裏遇到過這個? – Sveltely

+0

我記不清了。我記得當我第一次使用序列化庫時,在Boost文檔中的某處閱讀它。 – Paul

回答

1

如果使用boost序列化保存對象圖,該對象圖仍然可用,並且可以再次保存,而無需從磁盤讀取任何內容。

如果您想要使用高科技並引入更多複雜性,可以使用帶有managed_shared_memory段的Boost Interprocess庫。這使您能夠直接在磁盤文件(實際上,在由文件塊支持的內存頁面上)直接進行透明工作。這實際上引入了另一個問題:如何阻止從頻繁點擊磁盤的變化。

無償諮詢:

我認爲世界上最好的是,如果你的對象圖是(例如)一Composite pattern所有節點共享immutables。現在序列化是「免費的」(使用Boost),您可以輕鬆處理多個版本的程序狀態(邏輯上通常是「文檔」或「數據庫」),並通過Boost Serialization有效地保存/加載它們。這種模式有利於撤銷/重做,併發操作,事務犯¹


¹(!不是沒有額外的工作,但在原則上)