【问题标题】:Serialize C++ unordered_map to buffer (char*)将 C++ unordered_map 序列化到缓冲区 (char*)
【发布时间】:2016-08-19 14:51:13
【问题描述】:

如何将 unordered_map 序列化为缓冲区 (char*)?我四处搜索,大多数人建议使用 boost 序列化,但他们都使用 text_oarchive/text_iarchieve 序列化到文件或字符串流。我不太了解 text_oarchive (以及一般的提升序列化)以适应我的需要。

与下面的 2 个函数一样,第一个函数采用 unordered_map 并放入缓冲区并返回缓冲区大小。第二个获取缓冲区及其大小以返回 unordered_map

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

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

那么我该怎么做(有或没有提升)?任何帮助表示赞赏。

【问题讨论】:

  • 问题已编辑。为之前的不明确表示歉意。

标签: c++ serialization boost buffer unordered-map


【解决方案1】:

指针类型的原型有点奇怪。如果我们可以假设将它们修复成

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

这是一个使用 boost 序列化实现它们的演示程序:

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

【讨论】:

  • 谢谢,效果很好。但是有两个问题:(1)我听说人们提到,对于缓冲的序列化,我们必须注意位顺序(大端与小端),Boost 是否在后台解决了这个问题? (2) 除了 Boost C++ Library 书之外,还有什么推荐的 Boost 书?
  • 不知道你指的是哪本书。每当您的数据需要可移植时,您都必须考虑字节序。与缓冲无关。您可以搜索(我的)答案以获取有关可移植性和 Boost 序列化的更多信息
【解决方案2】:

使用unordered_map 中的begin()end() 对其进行迭代(并将其转换为您想要的任何内容)。 Example

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2011-08-26
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多