c++ - 无法使用 boost::serialization 和 shared_ptr 反序列化

标签 c++ polymorphism shared-ptr boost-serialization

<分区>

我实现了下面的类结构。我想序列化这些对象。

class Base
{
public:
  Base(void) = default;

  virtual double func(void) const = 0;


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

class DerivedA : public Base
{
public:
  DerivedA(void) = default;
  DerivedA(double a)
  : a_(a) {}

  virtual double func(void) const
  {
    return std::exp(a_);
  }

private:
  double a_; 

  friend class boost::serialization::access;
  template<class Archive>
  void serialize(Archive & ar, const unsigned int version)
  {
    ar & a_;
  }
}; 


class DerivedB : public Base
{
public:
  DerivedB(void) = default;
  DerivedB(double b)
  : b_(b) {}

  virtual double func(void) const
  {
    return std::log(b_);
  }

 private:
   double b_; 

   friend class boost::serialization::access;
   template<class Archive>
   void serialize(Archive & ar, const unsigned int version)
   {
     ar & b_;
   }
 }; 

我想为这些对象创建一个 shared_ptr vector ,并对它们进行序列化和反序列化。序列化似乎没问题,但我无法将它们反序列化。有什么想法吗?

void out(void)
{
  std::vector<std::shared_ptr<Base>> objects;
  std::shared_ptr<Base> m1(new DerivedA(1.0));
  std::shared_ptr<Base> m2(new DerivedB(4.0));
  objects.push_back(m1);
  objects.push_back(m2);

  std::ofstream ofs("filename");
  boost::archive::text_oarchive oa(ofs);

  for(auto o : objects)
  {
    oa << *o;
  }
}

void in(void)
{
  std::ifstream ifs(filename);
  boost::archive::text_iarchive ia(ifs);

  std::vector<std::shared_ptr<Base>> objects;

  std::shared_ptr<Base> m1(new DerivedA());
  ia >> *m1;
  models.push_back(m1);
  std::shared_ptr<Base> m2(new DerivedB());
  ia >> *m2;
  models.push_back(m2);  
}

干杯,迈克

最佳答案

这是我的看法: Live On Coliru

注意:

  • 使用boost::shared_ptr

  • 使用

    BOOST_SERIALIZATION_ASSUME_ABSTRACT(Base)
    BOOST_CLASS_EXPORT_KEY(DerivedA)
    BOOST_CLASS_EXPORT_KEY(DerivedB)
    
  • 使用

    ar & boost::serialization::base_object<Base>(*this);
    

    建立多态链接

  • 使用

    ar.template register_type<DerivedA>();
    ar.template register_type<DerivedB>();
    
  • 通过指针而非(l)值进行序列化

#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/export.hpp>
#include <boost/make_shared.hpp>
#include <fstream>

class DerivedA;
class DerivedB;

class Base
{
    public:
        Base(void) = default;
        virtual ~Base() = default;

        virtual double func(void) const = 0;

    private:
        friend class boost::serialization::access;
        template<class Archive>
            void serialize(Archive & ar, const unsigned int version)
            {
                ar.template register_type<DerivedA>();
                ar.template register_type<DerivedB>();
            }
}; 

typedef boost::shared_ptr<Base> BasePtr;

class DerivedA : public Base
{
    public:
        DerivedA(void) = default;
        DerivedA(double a)
            : a_(a) {}

        virtual double func(void) const
        {
            return std::exp(a_);
        }

    private:
        double a_; 

        friend class boost::serialization::access;
        template<class Archive>
            void serialize(Archive & ar, const unsigned int version)
            {
                ar & boost::serialization::base_object<Base>(*this);
                ar & a_;
            }
}; 


class DerivedB : public Base
{
    public:
        DerivedB(void) = default;
        DerivedB(double b)
            : b_(b) {}

        virtual double func(void) const
        {
            return std::log(b_);
        }

    private:
        double b_; 

        friend class boost::serialization::access;
        template<class Archive>
            void serialize(Archive & ar, const unsigned int version)
            {
                ar & boost::serialization::base_object<Base>(*this);
                ar & b_;
            }
}; 

BOOST_SERIALIZATION_ASSUME_ABSTRACT(Base)
BOOST_CLASS_EXPORT_KEY(DerivedA)
BOOST_CLASS_EXPORT_KEY(DerivedB)

void out(std::string filename)
{
    std::vector<BasePtr> objects;
    BasePtr m1(new DerivedA(1.0));
    BasePtr m2(new DerivedB(4.0));
    objects.push_back(m1);
    objects.push_back(m2);

    std::ofstream ofs(filename);
    boost::archive::text_oarchive oa(ofs);
    oa.template register_type<DerivedA>();
    oa.template register_type<DerivedB>();

    oa << objects;
}

std::vector<BasePtr > in(std::string filename)
{
    std::ifstream ifs(filename);
    boost::archive::text_iarchive ia(ifs);
    ia.template register_type<DerivedA>();
    ia.template register_type<DerivedB>();

    std::vector<BasePtr> objects;

    ia >> objects;

    return objects;
}

int main()
{
    out("test.out");
    auto r = in("test.out");
    return r.size();
}

关于c++ - 无法使用 boost::serialization 和 shared_ptr 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23891198/

相关文章:

android - 将 THINC Server 移植到 Android 平台

C++ 分支递归结构?

c++ - 窗口不断获取 WM_WINDOWPOSCHANGING

c++ - 如何使用基类指针引用派生类成员?

c++ - 为 boost::shared_ptr<const Foo> 命名一个 typedef

c++ - 正确重置 WM_SETCURSOR 处理程序中的光标

c++ - 从子类的STL vector 到基类 vector 的转换

c++ - 使用扩展的 sprite 类重载难度。这怎么错了?

shared-ptr - FreeRTOS 中的共享指针和队列

c++ - 如何获取对具有 shared_ptr 的对象的引用?