2013-05-17 4 views
1

Я пытаюсь построить дерево как структуру, чтобы провести тест, составленный из серии вопросов.Boost Сериализация структуры дерева

Идея заключается в том, что испытания, вопрос, QuestionPart бы все вытекают из следующего класса:

class Node 
{  
    friend class boost::serialization::access; 
    template<class Archive> 
    void serialize(Archive & ar, const unsigned int version) 
    { 
     ar & boost::serialization::make_nvp("children", m_children); 
     ar & boost::serialization::make_nvp("intro", m_intro); 
    } 

public: 
    Node(){}; 
    virtual ~Node(){}; 

    virtual void addChildNode(Node* _child);  
    virtual const std::string getIntro() const; 
    virtual Node* getChild(const _index) const; 
    virtual void setIntro(std::string _intro); 

protected: 
    std::vector<Node*> m_children; 
    std::string m_intro; 
}; 

Прежде чем делать все другие классы я попробовал следующее:

void saveTest(const Node &test, const char* filename) 
{ 
    // make an archive 
    std::ofstream ofs(filename); 
    boost::archive::xml_oarchive oa(ofs); 
    oa << BOOST_SERIALIZATION_NVP(test); 
} 

void createTest() 
{ 
    Node* test = new Node(); 
    Node* question1 = new Node(); 

    question1->setIntro("Question 1"); 

    test->addChildNode(question1); 
    test->setIntro("Test"); 

    saveTest(*test, fileLocation.c_str()); 
} 

Но это выбрасывая исключение и создавая только следующее:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<!DOCTYPE boost_serialization> 
<boost_serialization signature="serialization::archive" version="10"> 
<test class_id="0" tracking_level="1" version="0" object_id="_0"> 
<children class_id_reference="0" object_id="_1"> 
    <children</boost_serialization> 

Любое проникновение t будет высоко оценен.

+0

Считаете ли вы использование boost property_tree? – ppl

+0

Я видел, как он упоминается, и посмотрим, спасибо за ваше предложение. – henryprescott

ответ

1

Оказалось, что это простое исправление; увидев пример here, я изменил следующее:

std::vector<Node*> m_children; 

в

boost::ptr_vector<Node> m_children; 

который требует следующих включают:

#include <boost/ptr_container/serialize_ptr_vector.hpp> 

Однако, я не знаю, почему это работает (объекты не отслеживались, возможно?), поэтому объяснение будет приветствоваться!