我正在尝试序列化没有默认构造函数的派生类。我正在使用反序列化构造函数模式。我已经读过你必须注册派生类的类型,所以我在输出档案(outputArchive.register_type<Point>();
)中这样做。但是,当尝试使用输入存档注册相同类型时,我收到编译器错误,指出Point
没有默认构造函数(它没有)。在这种情况下我们该怎么做?
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/base_object.hpp>
#include <fstream>
class AbstractPoint
{
public:
virtual ~AbstractPoint(){}
virtual void DoSomething() = 0;
template<class TArchive>
void serialize(TArchive& archive, const unsigned int version)
{
// do nothing
}
};
class Point : public AbstractPoint
{
public:
Point(const double data) : mData(data) {}
void DoSomething(){}
template<class TArchive>
Point(TArchive& archive)
{
archive >> *this;
}
template<class TArchive>
void serialize(TArchive& archive, const unsigned int version)
{
// Without this, we get unregistered void cast
archive & boost::serialization::base_object<AbstractPoint>(*this);
archive & mData;
}
double mData;
};
int main()
{
std::shared_ptr<AbstractPoint> point(new Point(7.4));
std::ofstream outputStream("test.txt");
boost::archive::text_oarchive outputArchive(outputStream);
outputArchive.register_type<Point>();
outputArchive << point;
outputStream.close();
std::ifstream inputStream("test.txt");
boost::archive::text_iarchive inputArchive(inputStream);
//inputArchive.register_type<Point>(); // Compiler error: no Point::Point()
std::shared_ptr<AbstractPoint> pointRead(new Point(inputArchive));
Point* castedPoint = dynamic_cast<Point*>(pointRead.get());
std::cout << "Data: " << castedPoint->mData << std::endl;
return 0;
}
答案 0 :(得分:0)
如果某个类型没有默认构造函数,您可以使用save_construct_data
和load_construct_data
。
请注意,在通过指针进行序列化时,这些仅才会适用(原因很明显)。
示例如下:boost serialization of non-default constructible types和more