通过boost::serialization自定义的archive实现object成员树

想实现类似于vc debugger watch window那样能显示出对象的内部成员资料的效果, 最近看了看boost::serialization发现可以自定义一个archive来实现将object的成员变量保存到一个树形结构中去.我是通过修改xml_oarchive实现的.
首先修改basic_xml_oarchive为basic_tree_oarchive,这个类继承自common_oarchive, common_oarchive类实现了archive操作的主要interface和对于不同数据类型(指针, 对象, 派生类,版本)的控制.
然后修改xml_oarchive_impl为tree_oarchive_impl, 这个类主要实现了不同基本数据类型(比如char,int,float,..)的处理
以及修改xml_oarchive为tree_oarchive
对对象树结构定义如下
struct TreeNode
{
    std::string name;
    std::vector<TreeNode *>children;    //对于基本元素,为null
    TreeNode *parent;
    std::string type;    //used for 基本元素
    std::string value;

    TreeNode()
        : parent(0)
    {
    }

    TreeNode * AddChild(const std::string &nam)
    {
        TreeNode *child = new TreeNode;
        child->name = nam;
        child->parent = this;
        this->children.push_back(child);
        return child;
    }
};
在basic_tree_oarchive里定义成员变量 TreeNode *tree;
然后修改函数
 template<class T>
    void save_override(
        #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
        const
        #endif
        ::boost::serialization::nvp<T> & t,
        int
    ){
        save_start(t.name());

        assert(tree);
        tree = tree->AddChild(t.name());

        this->detail_common_oarchive::save_override(t.const_value(), 0);

        assert(tree);
        tree = tree->parent;
        assert(tree);

        save_end(t.name());
    }

在类里面实现不同的save
    BOOST_ARCHIVE_DECL(void)
    save(const double &s){
        std::cout << s;
        tree->type = "double";
        char c[20];
        sprintf(c, "%g", s);
        tree->value = c;
    }

    BOOST_ARCHIVE_DECL(void)
    save(const float &s){
        std::cout << s;
        tree->type = "float";
        char c[20];
        sprintf(c, "%g", s);
        tree->value = c;
    }

    BOOST_ARCHIVE_DECL(void)
    save(const int &s){
        std::cout << s;
        tree->type = "int";
        char c[20];
        sprintf(c, "%d", s);
        tree->value = c;
    }

    BOOST_ARCHIVE_DECL(void)
    save(const char * s){
        std::cout << s;
        tree->type = "char*";
        tree->value = s;
    }

 
    BOOST_ARCHIVE_DECL(void)
    save(const std::string &s)
    {
        std::cout << s;
        tree->type = "string";
        tree->value = s;
    }
这么就基本可以了...似乎很简单是把
对于UI显示嘛, 本想用那个proptree的(前面我有文章说过), 可是这个vc6的代码拿到vc2008下死活有问题, 又没能找到原因.所以作罢.郁闷...

posted on 2009-09-19 23:38  cutepig  阅读(1140)  评论(0编辑  收藏  举报

导航