我试图理解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
类型的对象?
答案 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的副本。