Boost序列化树结构

Boost Serialization Tree Structure

本文关键字:结构 序列化 Boost      更新时间:2023-10-16

我正在尝试构建一个树形结构来容纳由一系列问题组成的测试。

这个想法是,Test, Question, 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>

这是一个简单的修复;看到这里的一个示例后,我更改了以下内容:

std::vector<Node*> m_children;

boost::ptr_vector<Node> m_children;

需要以下内容:

#include <boost/ptr_container/serialize_ptr_vector.hpp>

然而,我不确定为什么会这样(对象可能没有被跟踪?),所以一个解释将是受欢迎的!