如何对地图使用boost :: serialize :: make_binary_object [英] how to use boost::serialize::make_binary_object against a map

查看:142
本文介绍了如何对地图使用boost :: serialize :: make_binary_object的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的意图是从map<int,std::string>获取输入并创建下面的代码无法执行的二进制存档,这是创建它的正确方法吗? 以及如何知道数据是否正确存档(使用boost进行理想化处理) 我是否只需要创建一个boost::archive::binary_iarchive oa(oss,1);并将其复制到oss?

my intention is to get input from map<int,std::string> and create the binary archive which the below code is failing to do , is this the right way of creating it? And how to know whether the data is correctly archived or not(desirializing using boost) Do i just need to create a boost::archive::binary_iarchive oa(oss,1); and copy it to oss ?

#include <fstream>
#include <boost/serialization/map.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <string>
#include <iostream>
#include <map>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/serialization.hpp>

using namespace std;

class MyConnections
{
  public:
    MyConnections()
    {

       e_group.insert( std::make_pair(1,"ETOTO") ) ;
       e_group.insert( std::make_pair(2,"ETOTO") ) ;

   }

 template<class archive>
void serialize(archive& ar, const unsigned int version)
{
    using boost::serialization::make_binary_object;
    ar &  boost::serialization::make_binary_object(e_group);
}


  public:
   typedef   map<int,std::string> groups;
   groups  e_group;
};

int main(int argc, char* argv[])
{
    const MyConnections conn;
    stringstream oss(ios_base::out|ios_base::binary);
    boost::archive::binary_oarchive oa(oss,1);
    oa << boost::serialization::make_binary_object(conn)
    std::cout<<oss.str;
}

错误

main.cpp: In member function 'void MyConnections::serialize(archive&, unsigned int)':
main.cpp:29:63: error: cannot convert 'MyConnections::groups {aka std::map<int, std::__cxx11::basic_string<char> >}' to 'void*' for argument '1' to 'const boost::serialization::binary_object boost::serialization::make_binary_object(void*, std::size_t)'
         ar &  boost::serialization::make_binary_object(e_group);
                                                               ^
main.cpp: In function 'int main(int, char**)':
main.cpp:42:55: error: cannot convert 'const MyConnections' to 'void*' for argument '1' to 'const boost::serialization::binary_object boost::serialization::make_binary_object(void*, std::size_t)'
    oa << boost::serialization::make_binary_object(conn)
                                                   ^

推荐答案

Std输出不支持随机二进制输出.您可能会使用base64编码的十六进制.

Std output doesn't support random binary output. You'd probably use hex of base64 encoding.

这是写十六进制字节的简单方法:

Here's a simplistic approach writing out hex bytes:

#include <sstream>
#include <iostream>
#include <iomanip>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/map.hpp>

using namespace std;

class MyConnections
{
    public:
        MyConnections()
        {

            e_group.insert( std::make_pair(1,"ETOTO") ) ;
            e_group.insert( std::make_pair(2,"ETOTO") ) ;

        }

        template<class archive>
            void serialize(archive& ar, const unsigned int /*version*/) {
                using boost::serialization::make_nvp;
                ar & make_nvp("Connections", e_group);
            }

    public:
        typedef   map<int,std::string> groups;
        groups  e_group;
};

std::string foo() {
    const MyConnections conn;

    stringstream oss(ios_base::out|ios_base::binary);
    boost::archive::binary_oarchive oa(oss);
    oa << boost::serialization::make_nvp("Connections", conn);
    std::string data = oss.str();
    return oss.str();
}

int main()
{
    std::string const data = foo();

    for (uint8_t ch : data) {
        std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(ch) << " ";
    }
}

打印:

    00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 05 00 00 00 00 00 00 00 45 54 4f 54 4f 02 00 00 00 05 00 00 00 00 00 00 00 45 54 4f 54 4f 

查看 在Coliru上直播

注意:我认为存档构造函数的,1参数很奇怪.如果要传递标志,请使用正确的枚举值.

NOTE: I think the ,1 parameter to the archive constructor was weird. If you're going to pass flags, use the proper enum values.

这篇关于如何对地图使用boost :: serialize :: make_binary_object的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆