2016-03-01 93 views
0

我想序列化一个没有默认构造函数的派生类。我正在使用反序列化构造函数模式。我读过你必须注册派生类的类型,所以我在输出档案中这样做(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

仅供参考我在这里与分裂这个问题,http://stackoverflow.com/questions/35753953/common-confusions-with-serializing-polymorphic-types –

回答

0

在一个类型没有默认构造函数的情况下,你可以使用save_construct_dataload_construct_data

请注意,这些将只有永远适用于通过指针序列化(出于显而易见的原因)。

例子在这里:boost serialization of non-default constructible typesmore

+0

我学到了其他一天(http://stackoverflow.com/questions/35722135/deserializing-construtor-doesnt-read-data-correctly)我应该使用反序列化构造函数模式。所以你说这个模式只在不序列化多态类型指针时才起作用? –

+0

@DavidDoria你的问题代码和答案代码似乎是一个典型的Boost序列化代码给我。问题代码因答案中陈述的原因而中断。我很想说答案代码仍然是错误的(很难让它工作可靠;我甚至不能开始考虑如何将它与容器的Boost序列化结合起来)。所以是的,那个答案没有回答你真正的问题,因为你提出了错误的问题。 – sehe

+0

不使用'save/load_construct_data'的一点是,如果你没有/想要一个指针,那么你就不需要像你想要的那样“伪造”/想要一个指针来完成序列化。 –

相关问题