如何从boost存档中读取通过指向基类的指针存储的对象?
How does reading of objects from a boost archive work that have been stored via pointers to base class?
我试图理解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的副本。
相关文章:
- 如何使用基类指针引用派生类成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 使用基类指针调用基类的值构造函数的语法是什么?
- 如何在基类指针向量的元素上应用重载的多态函数
- C++函数解析基类指针到派生类指针
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?
- 从基类指针派生派生类的模板类型
- 当键是虚拟继承中涉及的基类指针时,对 std::unordered_map 项的访问崩溃
- 如何使用函数(而不是构造函数)将派生类对象分配给基类指针
- 创建基类指针的向量并将派生类对象传递给它(多态性)
- 无法将派生类存储在基类指针的向量中
- 有没有办法在没有虚拟的情况下使用基类指针调用派生类函数
- 基类指针:在哪里使用 new 和 delete
- 如何在CRTP实现中传递基类指针
- C++继承从基类指针访问派生类中的非虚拟函数
- 通过基类指针获取派生类对象的引用
- C++通过基类指针提升子类的序列化
- 将派生对象分配给函数内的基类指针
- 如果基类指针无法访问派生类成员函数,那么多态性有什么方便的呢?