【问题标题】:Best way to take a snapshot of an object to a file将对象快照保存到文件的最佳方法
【发布时间】:2008-11-11 18:39:28
【问题描述】:

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

人为的例子:

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

我希望能够按照“myCollection: stuff = value, otherStuff = value”的方式查看输出。 但是如果另一个成员被添加到容器中,

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

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

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

【问题讨论】:

  • 我很高兴能发布关于 C# 序列化的帖子,然后我看到了 C++ 代码 =)

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


【解决方案1】:

您要查找的是“[reflection](http://en.wikipedia.org/wiki/Reflection_(computer_science)#C.2B.2B)”。

我在 Google 搜索“C++ 反射”时发现了两个有希望的链接:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      看看this library。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            没有真正简单的方法可以做到这一点,尽管您可能想简单地将内存转储到这样的地址:

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

            我真的建议不要这样做,除非你只有简单的类型。

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

            【讨论】:

              【解决方案7】:

              XDR 是一种独立于平台的方式。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-04-10
                • 1970-01-01
                • 2010-11-20
                • 2012-02-07
                • 1970-01-01
                • 1970-01-01
                • 2014-07-12
                • 1970-01-01
                相关资源
                最近更新 更多