【问题标题】:What's the format of boost.serialization's outputboost.serialization 的输出格式是什么
【发布时间】:2025-12-11 09:40:01
【问题描述】:

我尝试序列化一个向量和一个地图容器并通过 cout 输出它们的值。但是,我很难理解 boost 输出的含义。我的代码如下所示:

#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

我写的值 1 3 5 之前的数字 9 3 0 是什么意思? 0 0 2 0 0 0 怎么样? '1' 和 'one' 之间的 '3' 是否意味着有 3 个字符?

【问题讨论】:

    标签: serialization boost


    【解决方案1】:

    我不确定地图中的某些零(可能是某些版本号或跟踪级别),但对于其余部分:

    22 (length of the signature)
    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 修订而改变,因此您的应用程序不应依赖内部存档内容。

    【讨论】:

    • 我尝试了其他一些例子,看起来前 8 个字节总是 22,所以 22 必须是某个幻数而不是存档的大小。其实我相信 boost::serialization 没有帧格式。
    • @Cyber​​Snoopy 实际上,它实际上不是存档的大小(错误的措辞/错字),而是存档签名的大小/长度(“serialization::archive”)。
    【解决方案2】:

    如果您将这些行放在代码的末尾

    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 是正确的,2 之后的三个0 是:1)item_versionstd::pairmap 的值类型)2)tracking_levelstd::pair和 3) versionstd::pair

    【讨论】:

      【解决方案3】:

      22 是文本“serialization::archive”的长度。 我相信每个存档的文本前面都有这样一个文本长度数字。

      【讨论】:

      • 你错了。没有明确说明这一点。你没有仔细阅读我的评论。说它是“档案的大小”是完全不同的事情而且是错误的,更不用说它是一个神奇的数字。因此,请考虑删除您的评论。