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

How does reading of objects from a boost archive work that have been stored via pointers to base class?

本文关键字:基类 指针 对象 存储 boost 读取      更新时间:2023-10-16

我试图理解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类型的对象吗?

我相信这是指针类型的部分模板专门化。

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

然后是专门化:

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

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