2011-11-08 70 views
1

我在我的應用程序中使用boost::variantboost::serialize。序列化模塊內置支持序列化變體,因此:強大的boost :: variant序列化

boost::variant<int,double> u(3.14); 

// Do something with u; 

// Serialize 
oa << u; 

工作。但是,我的問題是序列化不健壯。根據我的應用程序的編譯方式,變體的元素可能會發生變化。目前,序列化模塊似乎只是嵌入'active'變體類型的索引;如果變體變爲boost::variant<double,string>這是一個問題。

任何人都可以提出改進方法,以便序列化/非序列化工作,以便序列化的類型是boost::variant的模板參數。 (因此,在上述情況下,boost::variant<int,double> u(3.14)可能會被非序列化爲boost::variant<double,std::string>。我知道這可能會要求我提供其他信息,例如類型的字符串化形式

+0

你爲什麼要改變變體的元素?您通常不希望您的文件格式規格發生變化。 – Mranz

+0

但是,我通常會同意程序本身是一個數值模擬。模擬課程的模板很多,有幾百萬種可能的組合。顯然,我不能將它們全部實例化爲可執行文件。鑑於我的用戶基礎都是自編譯的,使用變體來保存支持實例是合理的。 –

回答

3

如何將現成機制例如,如果您將boost::variant<int,double>更改爲boost::variant<int,std::string>並且不能再保留一個雙倍,那麼該怎麼辦?如果您想要類似的東西,我會想象您不得不這樣做自己寫,以涵蓋你所期望的情況,並適合你的「健壯」的定義。

你也可以建立一些文件升級邏輯...例如,你的程序的每個版本N都圍繞着(N-1,N-2 ...)結構定義的舊副本,以便你能夠編寫可用於提供能力的例程升級遇到的舊文件。

但是,真的,最好是儘可能在第一時間將文件格式正確設置好,然後再讓程序進入荒野!特別是編碼用戶意圖的數據(實際上只是緩存的派生結構可以在版本無法識別時丟棄和重新計算)。