2013-05-17 1 views
1

J'essaie de construire une structure arborescente pour organiser un test composé d'une série de questions.Structure de l'arborescence de Sérialisation de Boost

L'idée est que test, question, QuestionPart seraient tous dérivent de la classe suivante:

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; 
}; 

Avant de faire toutes les autres classes j'ai essayé les éléments suivants:

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()); 
} 

Mais ceci est lançant une exception et créant uniquement ce qui suit:

<?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> 

Je serais très apprécié.

+0

Avez-vous envisagé d'utiliser boost property_tree? – ppl

+0

Je l'ai vu mentionné et jetterai un coup d'oeil, merci pour votre suggestion. – henryprescott

Répondre

1

Il s'est avéré être une solution simple; après avoir vu un exemple here, j'ai changé les éléments suivants:

std::vector<Node*> m_children; 

à

boost::ptr_vector<Node> m_children; 

qui nécessite les éléments suivants comprennent:

#include <boost/ptr_container/serialize_ptr_vector.hpp> 

Cependant, je ne sais pas pourquoi cela fonctionne (les objets n'étaient peut-être pas suivis?), donc une explication serait la bienvenue!

Questions connexes