• 通过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下死活有问题, 又没能找到原因.所以作罢.郁闷...
  • 相关阅读:
    OSCP Learning Notes Buffer Overflows(3)
    OSCP Learning Notes Buffer Overflows(5)
    OSCP Learning Notes Exploit(3)
    OSCP Learning Notes Exploit(4)
    OSCP Learning Notes Exploit(1)
    OSCP Learning Notes Netcat
    OSCP Learning Notes Buffer Overflows(4)
    OSCP Learning Notes Buffer Overflows(1)
    OSCP Learning Notes Exploit(2)
    C++格式化输出 Learner
  • 原文地址:https://www.cnblogs.com/cutepig/p/1570266.html
Copyright © 2020-2023  润新知