Я пытаюсь сериализовать производный класс, который не имеет конструктора по умолчанию. Я использую шаблон десериализации. Я прочитал, что вам нужно зарегистрировать тип производного класса, поэтому я делаю это в выходном архиве (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;
}
FYI Я разделил этот вопрос между здесь и http://stackoverflow.com/questions/35753953/common-confusions-with-serializing-polymorphic-types –