如何对地图使用 boost::serialize::make_binary_object

Posted

技术标签:

【中文标题】如何对地图使用 boost::serialize::make_binary_object【英文标题】:how to use boost::serialize::make_binary_object against a map 【发布时间】:2017-03-28 15:10:29 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

#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 

Live On Coliru

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

【讨论】:

抱歉我的理解问题,因为我对此很陌生,你能解释一下为什么你不在这里使用 make_binary_object,我希望所有地图数据都成为二进制对象的一部分,我也想去欲望化,看看数据是否正确 另外,假设相同的序列化函数也适用于二进制和 xml 格式,我可以对 xml 文件和 bianry 文件使用相同的序列化函数吗? 是的。您必须为 XML 命名值(例如 make_nvp) 嗯,我的要求是也创建二进制对象和xml,有什么好的方法吗? 为什么你没有考虑make_binary_object函数?和 make_nvp 一样吗?

以上是关于如何对地图使用 boost::serialize::make_binary_object的主要内容,如果未能解决你的问题,请参考以下文章

强大的 boost::variant 序列化

如何在 Swift 中检测缩放对地图的影响

如何使用适用于 Android V2 的 Google Maps 处理地图移动端?

如何通过对vue js中的每个搜索结果使用模态在谷歌地图上显示json数据获得的纬度和经度?

如何在网页中调用百度地图api

了解GIS地图和可视化如何改变我们对地理信息的理解