序列化 C++ unordered_map 到缓冲区 (char*)
Serialize C++ unordered_map to buffer (char*)
如何将 unordered_map 序列化到缓冲区 (char*)?我搜索了一下,大多数人推荐使用 boost 序列化,但他们都使用 text_oarchive/text_iarchieve 序列化到文件或字符串流。我真的不太了解 text_oarchive(并且通常会促进序列化)以适应我的需要。
像下面的 2 个函数一样,第一个接受 unordered_map 并放入缓冲区以及 return 缓冲区大小。第二个需要一个缓冲区,它的大小为 return 和 unordered_map
void serialize(const unordered_map<int, int>& myMap, char** buf, int* bufSize);
unordered_map deserialize(char** buf, int* bufSize);
那么我该怎么做(有或没有提升)?感谢任何帮助。
使用 unordered_map
的 begin()
和 end()
对其进行迭代(并将其转换为您想要的任何内容)。 Example
指针类型的原型有点奇怪。如果我们可以假设将它们固定为
void serialize(const Map& myMap, char* buf, size_t bufSize);
Map deserialize(char const* buf, size_t bufSize);
这是一个使用 boost 序列化实现它们的演示程序:
#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
如何将 unordered_map 序列化到缓冲区 (char*)?我搜索了一下,大多数人推荐使用 boost 序列化,但他们都使用 text_oarchive/text_iarchieve 序列化到文件或字符串流。我真的不太了解 text_oarchive(并且通常会促进序列化)以适应我的需要。
像下面的 2 个函数一样,第一个接受 unordered_map 并放入缓冲区以及 return 缓冲区大小。第二个需要一个缓冲区,它的大小为 return 和 unordered_map
void serialize(const unordered_map<int, int>& myMap, char** buf, int* bufSize);
unordered_map deserialize(char** buf, int* bufSize);
那么我该怎么做(有或没有提升)?感谢任何帮助。
使用 unordered_map
的 begin()
和 end()
对其进行迭代(并将其转换为您想要的任何内容)。 Example
指针类型的原型有点奇怪。如果我们可以假设将它们固定为
void serialize(const Map& myMap, char* buf, size_t bufSize);
Map deserialize(char const* buf, size_t bufSize);
这是一个使用 boost 序列化实现它们的演示程序:
#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