2016-04-26 189 views
1

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

就像下面的两个函数一样,第一个函数接受一个unordered_map并放入一个缓冲区并返回缓冲区大小。第二个缓冲区和它的大小返回一个unordered_map

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

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

那么我该怎么做(无论是否有提升)?任何帮助表示赞赏。

+0

问题编辑。对之前缺乏清晰度表示歉意。 – user3685928

回答

2

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

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

下面是使用升压序列化实现他们一个演示程序:

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 
+0

谢谢,作品奇妙。两个问题虽然:(1)我听说有人提到,为了序列化缓冲区,我们必须小心位顺序(大端序列与小端序列),Boost是否可以在引擎盖下解决这个问题?和(2)除Boost C++ Library书籍以外的任何推荐Boost书籍? – user3685928

+0

我不知道你指的是哪本书。每当您的数据需要可移植时,您必须考虑排序。与缓冲无关。您可以搜索(我的)答案以获取更多关于可移植性和升级序列化的信息 – sehe

-2

使用unordered_mapbegin()end()来遍历它(并将其转换为任何你想要的)。 Example