我想序列化一个没有默认构造函数的派生类。我正在使用反序列化构造函数模式。我读过你必须注册派生类的类型,所以我在输出档案中这样做(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;
}
仅供参考我在这里与分裂这个问题,http://stackoverflow.com/questions/35753953/common-confusions-with-serializing-polymorphic-types –