想实现类似于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下死活有问题, 又没能找到原因.所以作罢.郁闷...