如何序列化boost :: interprocess :: containers :: vector

时间:2013-01-25 10:28:25

标签: serialization boost vector containers interprocess

我想在boost :: interprocess :: containers :: vector

中使用boost serilaization

通过包含

,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’

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

这里的教程非常有用:):

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