2016-04-26 191 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