如何从boost存档中读取对象,这些对象是通过指向基类的指针存储的?

时间:2011-08-29 15:58:30

标签: c++ serialization boost

我试图理解boost如何处理通过指向基类存储的对象的序列化。特别是如何从这样创建的档案中进行后续阅读。这是一些示例代码(省略包含所有标题):

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

class B : public A
{
  public:
    B() : x(0) {};
    B( int _x ) : x(_x) {};
    ~B() {};
    void dummy() {}; 
    int x;
  private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
      ar & boost::serialization::base_object<A>(*this);
      ar & x;
    }
};

BOOST_CLASS_EXPORT( B )
BOOST_CLASS_IMPLEMENTATION( B, boost::serialization::object_serializable)
BOOST_CLASS_TRACKING( B, boost::serialization::track_never)

int main(int argc, char *argv[])
{
  { //writing the archive
    boost::filesystem::ofstream file( "archive.dat", std::ios::trunc );
    boost::archive::text_oarchive archive( file );

    A* ptr = new B(3);
    archive & ptr;
  }

  { // reading the archive
    boost::filesystem::ifstream file( "archive.dat" );
    boost::archive::text_iarchive archive( file );

    /** What is supposed to go here? */
  }

  return 0;
}

我想到了

A* ptr;
archive & ptr;

不知何故似乎为读出部分做了工作。但它是如何工作的?它首先使用标准构造函数在堆上创建类型为B的对象(因为这似乎是必需的),然后设置内部成员的值吗?

有替代品吗?例如,如果我知道存档只包含B类型的对象(尽管通过基类指针序列化),我是否可以直接从存档中实例化B类型的对象?

1 个答案:

答案 0 :(得分:0)

我相信这是针对指针类型的部分模板特化。在某种程度上,助推器就是这样的:

class text_oarchive {
    template <class T> operator&(T);
};

然后有一个专业化:

template <class T*>
text_oarchive<T*>::operator&(T *t) {
    //serial the value as a pointer
}

您可以通过创建没有默认构造函数的类来测试它是否在堆上创建B的副本。