【问题标题】:how to serialize list of type shared_ptr pointer type using boost serialization如何使用boost序列化序列化类型shared_ptr指针类型的列表
【发布时间】:2014-07-01 13:34:41
【问题描述】:

我正在尝试序列化具有类似 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 *>>

【问题讨论】:

  • 请显示标题。你是否包含了'boost/serialization/list.hpp'、boost/serialization/shared_ptr.hpp'?
  • @Dieter Lücking - 添加了代码中使用的所有头文件。
  • SomeStruct 的序列化代码你写了吗?
  • 你的代码编译得很好,提供一个测试用例来显示这个问题。

标签: c++ serialization boost boost-serialization


【解决方案1】:

你想要的

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

不是std::list&lt;boost::shared_ptr&lt;SomeStruct*&gt;&gt;

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

【讨论】:

  • 为什么我们不能使用 std::list<:shared_ptr>>
  • @manu 为什么/如何使用 SomeStruct**?你会如何分配这个?我会说这要么是浪费和无用的,要么是一个非常糟糕的主意。 (可能两者都有)。
猜你喜欢
  • 2014-06-20
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
相关资源
最近更新 更多