![](/img/trans.png)
[英]A std::unordered_map facade for a std::unordered_set - how?
[英]serialize std::unordered_map < int, std::unordered_set<int> > with boost
我尝试序列化/反序列化std::unordered_map < int, std::unordered_set<int> >
当我看看boost / serialization / map.hpp它似乎很简单(甚至很难我也不太明白)以下代码似乎编译序列化但无法反序列化。
有人知道如何正确地做到这一点,还是可以指出这些STL序列化技术的一些文档? 我遗憾地找不到东西......
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <boost/serialization/map.hpp>
#include <boost/serialization/collections_save_imp.hpp>
#include <boost/serialization/collections_load_imp.hpp>
#include <boost/serialization/utility.hpp>
#include <boost/serialization/split_free.hpp>
namespace boost { namespace serialization {
template<class Archive, typename... TArgs >
inline void save(Archive & ar, std::unordered_map<TArgs...> const&t, unsigned) {
boost::serialization::stl::save_collection<Archive, std::unordered_map<TArgs...> >(ar, t);
}
template<class Archive, typename... TArgs >
inline void load(Archive & ar, std::unordered_map<TArgs...> &t, unsigned) {
boost::serialization::stl::load_collection<Archive,
std::unordered_map<TArgs...>,
boost::serialization::stl::archive_input_map<
Archive, std::unordered_map<TArgs...> >,
boost::serialization::stl::no_reserve_imp<std::unordered_map<TArgs...> >
>(ar, t);
}
// split non-intrusive serialization function member into separate
// non intrusive save/load member functions
template <class Archive, typename... TArgs>
inline void serialize(Archive & ar, std::unordered_map<TArgs...> &t, unsigned file_version) {
boost::serialization::split_free(ar, t, file_version);
}
} }
namespace boost { namespace serialization {
template<class Archive, typename... TArgs >
inline void save(Archive & ar, std::unordered_set<TArgs...> const&t, unsigned) {
boost::serialization::stl::save_collection<Archive, std::unordered_set<TArgs...> >(ar, t);
}
template<class Archive, typename... TArgs >
inline void load(Archive & ar, std::unordered_set<TArgs...> &t, unsigned) {
boost::serialization::stl::load_collection<Archive,
std::unordered_set<TArgs...>,
boost::serialization::stl::archive_input_map<
Archive, std::unordered_set<TArgs...> >,
boost::serialization::stl::no_reserve_imp<std::unordered_set<TArgs...> >
>(ar, t);
}
// split non-intrusive serialization function member into separate
// non intrusive save/load member functions
template <class Archive, typename... TArgs>
inline void serialize(Archive & ar, std::unordered_set<TArgs...> &t, unsigned file_version) {
boost::serialization::split_free(ar, t, file_version);
}
} }
int main()
{
std::stringstream ss;
boost::archive::binary_oarchive oa2(ss, boost::archive::no_codecvt | boost::archive::no_header);
std::unordered_map<int, std::unordered_set<int> > s, out;
s.emplace( 0, std::unordered_set<int>{9,19} );
oa2 << s;
// Try to load this!!
//boost::archive::binary_iarchive ia2(ss, boost::archive::no_codecvt | boost::archive::no_header);
//ia2 >> out;
}
Boost已经包含了自1.5.6版本以来序列化std::unordered_map
和std::unordered_set
(事实上它们是在2014年2月添加的 )
所以没有必要自己写:
#include <map>
#include <sstream>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/unordered_map.hpp>
#include <boost/serialization/unordered_set.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
int main()
{
std::stringstream ss;
std::unordered_map<int, std::unordered_set<int> > s, out;
s.emplace( 0, std::unordered_set<int>{9,19} );
boost::archive::text_oarchive oarch(ss);
oarch << s;
boost::archive::text_iarchive iarch(ss);
iarch >> out;
std::cout << (s == out) << std::endl;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.