将对象快照写入文件的最佳方法

时间:2008-11-11 18:39:28

标签: c++ visual-studio-2005 file-io

将对象的公共内容输出到人类可读文件的最佳方法是什么?我正在寻找一种方法来做这个,不需要我知道该类的所有成员,而是使用编译器告诉我存在什么成员,以及他们的名字是什么。必须有宏或类似的东西,对吧?

受挫的例子:

class Container
{
public:
    Container::Container() {/*initialize members*/};
    int stuff; 
    int otherStuff;
};
Container myCollection;

我希望能够做一些事情来看看“myCollection:stuff = value,otherStuff = value”的输出。 但是如果另一个成员被添加到Container,

class Container
{
public:
    Container::Container() {/*initialize members*/};
    int stuff;
    string evenMoreStuff;
    int otherStuff;
};
Container myCollection;

这次,这个快照的输出将是“myCollection:stuff = value,evenMoreStuff = value,otherStuff = value”

是否有可以帮助我完成此操作的宏?这甚至可能吗? (另外,我无法修改Container类。) 另一个注意事项:我对VS中的潜在宏感兴趣,但也欢迎其他解决方案。

7 个答案:

答案 0 :(得分:2)

您正在寻找的是“[反思](http://en.wikipedia.org/wiki/Reflection_(computer_science)#C.2B.2B)”。

我找到了两个有希望的链接,谷歌搜索“C ++反射”:

http://www.garret.ru/cppreflection/docs/reflect.html

http://seal-reflex.web.cern.ch/seal-reflex/index.html

答案 1 :(得分:2)

Boost有一个序列化库,可以序列化为文本文件。但是,您现在无法知道该类包含哪些成员。你需要反思,C ++没有。

答案 2 :(得分:1)

看看this library

答案 3 :(得分:1)

您需要的是对象序列化或对象编组。 stackoverflow中的recurrent thema

答案 4 :(得分:1)

我强烈建议您查看Google的Protocol Buffers

答案 5 :(得分:0)

遗憾的是,没有宏可以为您做到这一点。您正在寻找的是反射型库。这些可以从相当简单到家庭卷制的怪物变化,在工作环境中没有地位。

没有真正简单的方法可以做到这一点,虽然你可能只想把内存转储到这样的地址:

char *buffer = new char[sizeof(Container)];
memcpy(buffer, containerInstance, sizeof(Container));

我真的建议反对它,除非你所拥有的都是简单的类型。

如果你想要一些非常简单但不完整的东西,我建议你自己编写 printOn(ostream &)成员方法。

答案 6 :(得分:0)

XDR是以独立于平台的方式实现此目的的一种方式。