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++ 静态类型的性质(以及它缺乏自省)相冲突。一旦一个类型被删除,通常就不可能恢复它。
您需要比较器的类型在 OR 的类型中是明确map
的,以便有外部手段来查找它。在任何情况下,可能很难将其放入 Boost.Serialization(无上下文)中。使用常规谓词类可能会更好。