【问题标题】:How to serialize boost::interprocess::containers::vector如何序列化 boost::interprocess::containers::vector
【发布时间】:2013-01-25 10:28:24
【问题描述】:

我想使用带有 boost::interprocess::containers::vector 的 boost 序列化

通过包含

,std::vector 的序列化工作正常
#include <boost/interprocess/containers/vector.hpp>

但我有一个包含共享向量的类

class MyClass {
  public:
    typedef boost::interprocess::allocator<double, SegmentManager> Allocator;
    typedef boost::interprocess::vector<double, Allocator > VectorDouble;
    VectorDouble *pVar;

    template<class archive>  
    void serialize ( archive &ar, const unsigned int version ) {
        using boost::serialization::make_nvp;
        ar & make_nvp ( "data", *pVar; );  # This does not work
        # what works it creating a std::vector and copy the data
    }
...
    MyClass(){
      # creating the shared memory and the pointer ot pVarß
    }

    ~MyClass(){
      # release data
    }
}

我收到错误:

error: ‘class boost::container::vector<double, boost::interprocess::allocator<double, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0u>, boost::interprocess::iset_index> > >’ has no member named ‘serialize’

【问题讨论】:

    标签: serialization boost vector containers interprocess


    【解决方案1】:

    基于标题,我编写了以下标题,它允许序列化进程间向量。 更多详情请见my github repo

    问候 马库斯

    #ifndef SHMFW_SERIALIZATION_INTERPROCESS_VECTOR_HPP
    #define SHMFW_SERIALIZATION_INTERPROCESS_VECTOR_HPP
    
    
    #include <boost/serialization/vector.hpp>
    #include <boost/interprocess/containers/vector.hpp>
    
    namespace boost { 
    namespace serialization {
    
    template<class Archive, class U, class Allocator>
    
    inline void save(
        Archive & ar,
        const boost::interprocess::vector<U, Allocator> &t,
        const unsigned int file_version
    ){
        boost::serialization::stl::save_collection<Archive, boost::interprocess::vector<U, Allocator> >(
            ar, t
        );
    }
    
    template<class Archive, class U, class Allocator>
    inline void load(
        Archive & ar,
        boost::interprocess::vector<U, Allocator> &t,
        const unsigned int file_version
    ){
    #ifdef BOOST_SERIALIZATION_VECTOR_135_HPP
        if (ar.get_library_version()==boost::archive::library_version_type(5))
        {
          load(ar,t,file_version, boost::is_arithmetic<U>());
          return;
        }
    #endif
        boost::serialization::stl::load_collection<
            Archive,
            boost::interprocess::vector<U, Allocator>,
            boost::serialization::stl::archive_input_seq<
                Archive, boost::interprocess::vector<U, Allocator> 
            >,
            boost::serialization::stl::reserve_imp<boost::interprocess::vector<U, Allocator> >
        >(ar, t);
    }
    
    // split non-intrusive serialization function member into separate
    // non intrusive save/load member functions
    template<class Archive, class U, class Allocator>
    inline void serialize(
        Archive & ar,
        boost::interprocess::vector<U, Allocator> & t,
        const unsigned int file_version
    ){
        boost::serialization::split_free(ar, t, file_version);
    }
    
    #if ! BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
    
    /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
    // vector<bool>
    template<class Archive, class Allocator>
    inline void save(
        Archive & ar,
        const boost::interprocess::vector<bool, Allocator> &t,
        const unsigned int /* file_version */
    ){
        // record number of elements
        collection_size_type count (t.size());
        ar << BOOST_SERIALIZATION_NVP(count);
        boost::interprocess::vector<bool>::const_iterator it = t.begin();
        while(count-- > 0){
            bool tb = *it++;
            ar << boost::serialization::make_nvp("item", tb);
        }
    }
    
    template<class Archive, class Allocator>
    inline void load(
        Archive & ar,
        boost::interprocess::vector<bool, Allocator> &t,
        const unsigned int /* file_version */
    ){
        // retrieve number of elements
        collection_size_type count;
        ar >> BOOST_SERIALIZATION_NVP(count);
        t.clear();
        while(count-- > 0){
            bool i;
            ar >> boost::serialization::make_nvp("item", i);
            t.push_back(i);
        }
    }
    
    // split non-intrusive serialization function member into separate
    // non intrusive save/load member functions
    template<class Archive, class Allocator>
    inline void serialize(
        Archive & ar,
        boost::interprocess::vector<bool, Allocator> & t,
        const unsigned int file_version
    ){
        boost::serialization::split_free(ar, t, file_version);
    }
    
    #endif // BOOST_WORKAROUND
    
    };
    };
    
    #endif // SHMFW_SERIALIZATION_INTERPROCESS_VECTOR_HPP
    

    【讨论】:

      【解决方案2】:

      如果您查看 boost 序列化库,您必须手动定义如何序列化某些内容。它所能做的就是为你序列化基本类型——你必须为它“拆开”。因此,正如错误所说,它没有所需的序列化方法,或者您可以根据是否希望它具有侵入性来制作自己的外部序列化方法。

      这里的教程很有帮助:):

      http://www.boost.org/doc/libs/1_54_0/libs/serialization/doc/index.html

      【讨论】:

        猜你喜欢
        • 2018-07-24
        • 2011-09-17
        • 1970-01-01
        • 2011-05-15
        • 1970-01-01
        • 2016-01-24
        • 2012-05-20
        • 2011-06-07
        • 1970-01-01
        相关资源
        最近更新 更多