2010-09-14 97 views
12

我使用Boost.Serialization來序列化一個std :: map。代碼看起來像這樣Boost.Serialization在不同平臺上的序列化程度不同嗎?

void Dictionary::serialize(std::string & buffer) 
{ 
    try { 
    std::stringstream ss; 
    boost::archive::binary_oarchive archive(ss); 
    archive << dict_; 
    buffer = ss.str(); 
    } catch (const std::exception & ex) { 
    throw DictionaryException(ex.what()); 
    } 
} 

void Dictionary::deserialize(const char * const data, int length) 
{ 
    try { 
    namespace io = boost::iostreams; 
    io::array_source source(data, length); 
    io::stream<io::array_source> in(source); 
    boost::archive::binary_iarchive archive(in); 
    archive >> dict_; 
    } catch (const std::exception & ex) { 
    throw DictionaryException(ex.what()); 
    } 
} 

我在Mac Snow Leopard和Ubuntu Lucid 10.04上編譯並測試了代碼。兩個系統都有Boost 1.40。在Mac上,我自己構建了代碼。在Ubuntu上,我通過aptitude獲得了二進制文件。

問題:當我在Mac上序列化地圖時,我無法在Ubuntu盒上反序列化它。我得到無效簽名例外,如果我嘗試。

回答

15

嘗試使用text_iarchivetext_oarchive代替二進制檔案。從documentation

在本教程中,我們使用了 特定的存檔類 - text_oarchive的保存和 text_iarchive裝載。文本 檔案呈現數據作爲文本,並且是 跨平臺移植。另外 對文本檔案,庫包括 歸檔類的原生二進制數據 和xml格式的數據。到 的接口所有歸檔類都完全相同。 一旦爲一個類定義了序列化 ,該類可以將 序列化爲任何類型的存檔。

+5

請注意,這可能會對應用程序的性能產生非常顯着的影響。 – 2011-10-24 14:56:09

9

升壓:歸檔:: binary_xarchive目前不便於攜帶

隨着我的解釋,即意味着可以在不同平臺上的差異。文本檔案在所有系統上爲您提供相同的輸入/輸出行爲。
也有是試圖解決二進制存檔的可移植性問題相關的TODO條目:TODO Entry

3

我的答案同意,但想添加一個澄清註釋。你可能會認爲這是一個煩人的疏忽,但實際上想出並實現一個可移植的二進制格式並不是一件小事。我知道的唯一標準是有效解決二進制文件中的問題是ASN.1

XML pruports解決相同的問題,但通常在文本中。有一種稱爲Fast Infoset的XML的搭載標準,允許XML以二進制形式編碼數據,但它使用ASN.1。

+0

哇。我不確定自己以前聽過的「有效」和「ASN.1」如此接近。但之後,我曾經有過調試ASN的需求。1是其他人寫的解析器,所以我傾向於將它與幾個小時的極度痛苦聯繫起來。實際上可能不是ASN.1的錯。 – 2010-09-14 13:02:58

+0

我不爭辯。我的錯。我應該閱讀Boost.Serialization文檔。文字很好。 – 2010-09-14 13:03:52

+0

@Steve Jessop - 根本不是你的錯,但我認爲它的主要任務是錯誤的。在那裏可能有一些通用的ASN.1解析器,但是我所見過的每一個解析器都只是解析ASN.1的子集,而不管對方是誰。即使這是一個多毛的任務。 – 2010-09-14 16:04:26

7

text_archives的性能大於binary_archive。如果表現是你的事情,你可以試試an unofficial portable binary archiveeos_portable_archive。我用它在Windows上以32位和64位序列化數據,並取得成功。你可以放棄它。

只需要將文件放入序列化目錄。那裏的文件沒有與最新的boost版本(1.44.0)保持同步,但你只需要進行2個非常小的調整就可以使其工作(編譯器會以非常明顯的錯誤信息告訴你)。

+1

'eos_portable_archive'不支持序列化wstrings,這對我來說打破了交易。有一個portable_binary_iarchive.hpp,帶有boost(在boost/libs/serialization/example中),它沒有這個限制,對我來說工作得很好。它還有其他一些限制[http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/todo.html#portablebinaryarchives] – 2011-10-29 18:10:36

+0

@Omer Raviv:便攜式歸檔文件不支持序列化浮點類型,這在當時已經被破壞了。事實上,我意識到'boost :: serialization' [增加了可怕的大小](http://lists.boost.org/boost-users/2010/09/63015.php)到我放棄並自行推出的可執行文件。我不確定是否更新版本的boost已經解決了這個問題。 – kizzx2 2011-10-30 06:22:06

+3

**更新:**現在EOS便攜式歸檔v5.0 [支持wstring](http://epa.codeplex.com/releases/view/91073)。新家是[這裏](http://epa.codeplex.com/)。 – 2013-05-22 08:51:10

相關問題