STL unordered_map的序列化

时间:2012-12-14 12:22:34

标签: c++ serialization boost unordered-map

我有一个使用带有此定义的无序地图的程序:

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

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

1 个答案:

答案 0 :(得分:11)

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


序列化地图(不论其类型)很容易。从根本上说:

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 ++静态类型性质(以及缺乏内省)发生冲突。一旦类型被删除,通常不可能恢复它。

您需要在map OR的类型中将比较器的类型显式以具有外部均值来查找它。无论如何,它可能很难适应Boost.Serialization(无上下文)。你可能会更好地使用常规谓词类。