2016-04-26 11 views
1

unordered_mapをバッファ(char *)にシリアル化するにはどうすればよいですか?私は検索したが、ほとんどの人はブーストのシリアライゼーションを使用することをお勧めしますが、それらはすべてtext_oarchive/text_iarchieveを使用してファイルまたはstringstreamにシリアル化します。私はtext_oarchiveをよく理解しておらず、一般的にはシリアライゼーションを強化しています。C++ unordered_mapをbuffer(char *)にシリアライズ

以下の2つの関数と同様に、1番目の関数はunordered_mapを取得してバッファに格納し、バッファサイズも返します。第二1は、どのように私は(どちらかとかブーストなし)ことを行うことができます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

ありがとうございます、素晴らしく働いています。しかし、2つの質問:(1)私はビット順(ビッグエンディアン対リトルエンディアン)に注意する必要があります、バッファーのシリアル化のために、ブーストはボンネットの下でこの問題を解決していることを言いましたか? (2)Boost C++ Library以外のBoostに関する推奨書籍はありますか? – user3685928

+0

あなたが参照している本がわかりません。あなたのデータをポータブルにする必要があるときはいつでも、エンディアンについて考える必要があります。バッファリングとは関係ありません。あなたは、ポータビリティとBoost Serializationに関するさらに多くの情報を(私が)検索することができます – sehe

-2

unordered_mapbegin()end()を使用して繰り返します(必要に応じて変換します)。 Example