2013-04-22 28 views
4

我嘗試序列化矢量和地圖容器並通過cout輸出它們的值。然而,我很難獲得助推輸出的意義。我的代碼如下所示:boost.serialization的輸出格式是什麼

#include <iostream> 
#include <boost/serialization/vector.hpp> 
#include <boost/serialization/map.hpp> 
#include <boost/assign.hpp> 
#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <sstream> 
#include <fstream> 

using namespace std; 

int main() 
{ 
    vector<int> v = boost::assign::list_of(1)(3)(5); 
    map<int, string> m = boost::assign::map_list_of(1,"one")(2,"two"); 

    std::stringstream ss; 
    boost::archive::text_oarchive oa(ss); 
    oa<<v<<m; 

    vector<int> v_; 
    map<int,string> m_; 
    boost::archive::text_iarchive ia(ss); 
    ia>>v_>>m_; 
    boost::archive::text_oarchive ib(cout); 
    ib<<v_<<m_; 
    return 0; 
} 

輸出看起來是這樣的:

22 serialization::archive 9 3 0 1 3 5 0 0 2 0 0 0 1 3 one 2 3 two 

什麼是數字9 3 0的值1 3 5我之前撰寫的含義?那麼0 0 2 0 0 0? '1'和'one'之間的'3'是否意味着有3個字符?

回答

5

我不知道在地圖上一些零(也許有些版本號或跟蹤的水平),但其餘部分:

22 (size of the archive) 
serialization::archive (signature) 
9 (archive version, 10 on boost 1.53) 
3 (vector size) 
0 (item version) 
1 3 5 (vector items) 
0 (map class tracking level ?) 
0 (map class version ?) 
2 (map size) 
0 (item class tracking _level ?) 
0 (item class version ?) 
0 (item version) 
1 (key) 3 (value length) one (value) 
2 (key) 3 (value length) two (value) 

注意,文本輸出的內容和格式是Boost的內部業務並可能隨着將來的Boost修訂而改變,所以你的應用程序不應該依賴於內部存檔內容。

+0

我試了一些其他的例子,看起來像前8個字節總是22,所以22必須是一些幻數,而不是歸檔的大小。其實我相信boost :: serialization沒有幀格式。 – CyberSnoopy 2017-06-20 19:38:48

3

如果你把這些線在你的代碼

boost::archive::xml_oarchive ib(cout); 
ib<< boost::serialization::make_nvp("v", v_) << boost::serialization::make_nvp("m", m_); // ib<<v_<<m_; 
return 0; 

的最後,你會得到這樣的輸出,它描述了它的自我:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<!DOCTYPE boost_serialization> 
<boost_serialization signature="serialization::archive" version="10"> 
<v> 
    <count>3</count> 
    <item_version>0</item_version> 
    <item>1</item> 
    <item>3</item> 
    <item>5</item> 
</v> 
<m class_id="1" tracking_level="0" version="0"> 
    <count>2</count> 
    <item_version>0</item_version> 
    <item class_id="2" tracking_level="0" version="0"> 
     <first>1</first> 
     <second>one</second> 
    </item> 
    <item> 
     <first>2</first> 
     <second>two</second> 
    </item> 
</m> 
</boost_serialization> 

所以@zacinter是正確的,這三個02是:1)item_version(的std::pairmap的值類型)2)tracking_levelstd::pair和3)versionstd::pair