2013-04-22 171 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