将C ++ unordered_map序列化为缓冲区(char *)

时间:2016-04-26 01:11:49

标签: c++ serialization boost buffer unordered-map

如何将unordered_map序列化为缓冲区(char *)?我搜索过,大多数人建议使用boost序列化,但他们都使用text_oarchive / text_iarchieve序列化到文件或字符串流。我不太了解text_oarchive(并提升序列化),足以适应我的需要。

与下面的两个函数一样,第一个函数采用unordered_map并输入缓冲区并返回缓冲区大小。第二个采用缓冲区及其大小来返回unordered_map

void serialize(const unordered_map<int, int>& myMap, char** buf, int* bufSize);

unordered_map deserialize(char** buf, int* bufSize);

那我怎么能这样做(无论有没有提升)?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

原型对指针类型有点奇怪。如果我们可以假设将它们固定到

void serialize(const Map& myMap, char* buf, size_t bufSize);
Map deserialize(char const* buf, size_t bufSize);

这是一个使用boost序列化实现它们的演示程序:

<强> Live On Coliru

#include <unordered_map>
#include <string>
#include <iostream>

typedef std::unordered_map<int, std::string> Map;

void serialize(const Map& myMap, char* buf, size_t bufSize);
Map deserialize(char const* buf, size_t bufSize);

int main() {
    char buffer[4096];

    serialize({ { 1, "one" }, { 2, "two" }, /* etc */ }, buffer, sizeof(buffer));
    auto data = deserialize(buffer, sizeof(buffer));

    for (auto p : data) 
        std::cout << p.first << " -> " << p.second << "\n";
}

#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>

#include <boost/serialization/unordered_map.hpp>
#include <boost/serialization/string.hpp>

void serialize(const Map& myMap, char* buf, size_t bufSize)
{
    boost::iostreams::stream<boost::iostreams::array_sink> os(buf, bufSize);
    boost::archive::binary_oarchive oa(os);

    oa << myMap;
}

Map deserialize(char const* buf, size_t bufSize)
{
    boost::iostreams::stream<boost::iostreams::array_source> is(buf, bufSize);
    boost::archive::binary_iarchive ia(is);

    Map data;
    ia >> data;
    return data;
}

打印

1 -> one
2 -> two

答案 1 :(得分:-2)

使用begin()的{​​{1}}和end()来迭代它(并将其转换为您想要的任何内容)。 Example