如何使用boost序列化序列化类型shared_ptr指针类型的列表

时间:2014-05-13 18:15:40

标签: c++ serialization boost boost-serialization

我试图序列化具有 std :: list>类型的成员变量的类。 LSS

#include <boost/serialization/optional.hpp> 
#include <boost/serialization/map.hpp> 
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/list.hpp>

struct SomeStruct
{
     int x;
     double y;

     private:
      friend class boost::serialization::access;
      template<class Archive>
      void serialize(Archive &at, const unsigned int version)
      {
         at & x; 
         at & y;
      }

};

class BuildTest
{

    std::list<boost::shared_ptr<SomeStruct *>> lss ; 
    std::string name;

    private:
      friend class boost::serialization::access;
      template<class Archive>
      void serialize(Archive &at, const unsigned int version)
      {
         at & lss;  // is this sufficient to serialize lss ?
         at & name;
      } 

}

我添加了所有必需的头文件以进行boost序列化。有类似的问题,但有正确的答案how do i serialize list variable of type <boost::shared_ptr<void *>>

1 个答案:

答案 0 :(得分:1)

你想要

std::list<boost::shared_ptr<SomeStruct>> lss ; 

不是std::list<boost::shared_ptr<SomeStruct*>>

查看 Live On Coliru

#include <boost/serialization/optional.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/list.hpp>

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/make_shared.hpp>

struct SomeStruct {
    int x;
    double y;

private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive &at, const unsigned int version) {
        at & x;
        at & y;
    }

};

class BuildTest {
  public:

    std::list<boost::shared_ptr<SomeStruct>> lss ;
    std::string name;

  private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive &at, const unsigned int version) {
        at & lss;  // is this sufficient to serialize lss ?
        at & name;
    }

};

int main() {
    BuildTest bt;
    bt.name = "Let's try this";
    bt.lss = { boost::make_shared<SomeStruct>(), boost::make_shared<SomeStruct>() };
    boost::archive::text_oarchive oa(std::cout);
    oa << bt;
}