2016-04-26 4 views
1

Wie kann ich unordered_map in einen Puffer (char *) serialisieren? Ich habe herumgesucht, die meisten Leute empfehlen Boost-Serialisierung, aber alle verwenden text_oarchive/text_iarchieve, um eine Datei oder einen Stringstream zu serialisieren. Ich verstehe text_oarchive nicht wirklich und stimme die Serialisierung im Allgemeinen nicht gut genug, um mich an meine Bedürfnisse anzupassen.Serialize C++ unordered_map zu puffern (char *)

Wie die folgenden 2 Funktionen, nimmt die erste eine unordered_map und wird in einen Puffer eingefügt und gibt auch die Puffergröße zurück. Der zweit man nimmt einen Puffer und seine Größe ein unordered_map

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

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

So zurückzukehren, wie kann ich das tun (entweder mit oder ohne Verstärkung)? Jede Hilfe wird geschätzt.

+0

Frage bearbeitet. Entschuldige dich für den Mangel an Klarheit vorher. – user3685928

Antwort

2

Die Prototypen sind ein bisschen seltsam mit den Zeigertypen. Wenn wir annehmen, können sie in

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

Hier ist ein Demo-Programm zu beheben deren Umsetzung mit boost Serialisierung:

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; 
} 

Drucke

1 -> one 
2 -> two 
+0

Danke, funktioniert wunderbar. Zwei Fragen allerdings: (1) Ich habe gehört, dass die Leute erwähnen, dass für die Serialisierung zu puffern, wir müssen auf Bit-Reihenfolge achten (Big Endian vs Little Endian), löst Boost dieses Problem unter der Haube? und (2) jedes empfohlene Buch für Boost außer dem Boost C++ Library Buch? – user3685928

+0

Ich weiß nicht, auf welches Buch Sie sich beziehen. Sie müssen über Endianness nachdenken, wann immer Ihre Daten portabel sein müssen. Nichts mit Pufferung zu tun. Sie können (meine) Antworten nach weiteren Informationen zur Portabilität und Boost-Serialisierung durchsuchen – sehe

-2

Verwenden Sie begin() und end() der unordered_map, um darüber zu iterieren (und zu konvertieren, was auch immer Sie wollen). Example