zoukankan      html  css  js  c++  java
  • 通过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下死活有问题, 又没能找到原因.所以作罢.郁闷...
  • 相关阅读:
    20145318 《信息安全系统设计基础》第11周学习总结
    20145318 《信息安全系统设计基础》第10周学习总结
    20145318 《信息安全系统设计基础》第9周学习总结
    20145318 《信息安全系统设计基础》期中总结
    20145317《信息安全系统设计基础》课程总结
    20145317《信息安全系统设计基础》第十四周学习总结
    20145317《信息安全系统设计基础》第十三周学习总结
    20145317《信息安全系统设计基础》第十二周学习总结1
    实验三:实时系统的移植
    实验五:通讯协议设计
  • 原文地址:https://www.cnblogs.com/cutepig/p/1570266.html
Copyright © 2011-2022 走看看