注册没有默认构造函数的类型

时间:2016-03-01 23:07:11

标签: c++ boost boost-serialization

我正在尝试序列化没有默认构造函数的派生类。我正在使用反序列化构造函数模式。我已经读过你必须注册派生类的类型,所以我在输出档案(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;
}

1 个答案:

答案 0 :(得分:0)

如果某个类型没有默认构造函数,您可以使用save_construct_dataload_construct_data

请注意,在通过指针进行序列化时,这些才会适用(原因很明显)。

示例如下:boost serialization of non-default constructible typesmore