【问题标题】:serialize std::unordered_map < int, std::unordered_set<int> > with boost用 boost 序列化 std::unordered_map < int, std::unordered_set<int> >
【发布时间】:2015-10-22 06:18:00
【问题描述】:

我尝试序列化/反序列化 std::unordered_map &lt; int, std::unordered_set&lt;int&gt; &gt; 当我查看 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;
}

http://coliru.stacked-crooked.com/a/663c0ce7bf632f85

【问题讨论】:

    标签: c++ c++11 serialization boost


    【解决方案1】:

    Boost 从 1.5.6 版本开始已经包含了序列化 std::unordered_mapstd::unordered_set 的方法(实际上它们是 added in February 2014

    所以没必要自己写:

    #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;
    }
    

    live on coliru

    【讨论】:

    猜你喜欢
    • 2016-01-24
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2016-03-14
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多