c++ - STL unordered_map 序列化

标签 c++ serialization boost unordered-map

我有一个程序使用具有以下定义的无序映射:

unordered_map<const char*, vector<pair<int, int> >, function<unsigned int (const char *str)> > myMap(30000, hashing);

其中散列是一个用于散列键的函数。我的问题是 -> 如何序列化这种结构并在之后反序列化它?我真的需要它,并且尽可能快速高效。我一直在阅读有关 boost 库的信息,但我不太了解如何将它们与此类内容一起使用。我知道有一些用于无序映射的 boost 库,但是,显然我做错了,编译器抛出了很多错误。有人可以给我一个关于如何序列化它的示例代码吗?谢谢。

最佳答案

TL;DR 您无法序列化 std::function ,改用常规谓词类。


序列化 map (无论其类型)很容易。本质上是:

typedef std::map<std::string, std::string> Map;

void serialize(Serializer& out, Map const& map) {
    out << map.size();
    for (auto const& p: map) { out << p.first << p.second; }
}

Map deserialize(Deserializer& in) {
    Map map;

    size_t size = 0;
    in >> size;

    for (size_t i = 0; i != size; ++i) {
        Map::key_type key;
        Map::mapped_type value;
        in >> key >> value;
        map[key] = value;
    }

    return map;
}

除了在一般情况下比较器和分配器都可以是有状态的,对吗?

void serialize(Serializer& out, Map const& map) {
+   out << map.value_compare() << map.get_allocator();

    out << map.size();
    for (auto const& p: map) { out << p.first << p.second; }
}

Map deserialize(Deserializer& in) {
+   Map::key_compare comparator;
+   Map::allocator_type allocator;
+
+   in >> comparator >> allocator;
+
+   Map map(comparator, allocator)

    size_t size = 0;
    in >> size;
    for (size_t i = 0; i != size; ++i) {
        Map::key_type key;
        Map::mapped_type value;
        in >> key >> value;
        map[key] = value;
    }

    return map;
}

因此,在您的情况下,假设 Boost.Serialization 知道如何处理 std::allocator (它是无状态的),应该如何序列化 std::function<unsigned int(char const*)>

答案:这是不可能的,因为std::function执行类型删除,这与 C++ 静态类型的性质(及其缺乏内省(introspection))冲突。一旦一个类型被删除,通常就不可能恢复它。

您需要比较器的类型在 map 的类型中显式或者有一个外部手段来查找它。无论如何,可能很难将其放入 Boost.Serialization(无上下文)中。使用常规谓词类可能会更好。

关于c++ - STL unordered_map 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13878618/

相关文章:

c# - 反序列化其中包含引号和撇号的 JSON 字符串

c++ - boost 共享内存操作c++

c++ - TCP 缓冲区解析器

c++ - "unresolved external symbol"关于 char 数组的模板特化

c++ - 通过一个 switch 语句发送不同的变量

Java:何时序列化非序列化对象或将它们置于 transient ?

c# - 如何将 XmlElementAttribute 用于 List<T>?

c++ - 使用 boost_foreach 遍历 unordered_map

c++ - 如何用等距透视渲染?

c++ - 使用模板使不同长度的项目保持在堆栈中?