代码之家  ›  专栏  ›  技术社区  ›  kshahar

如何以模块方式保存和加载C++应用程序状态

  •  2
  • kshahar  · 技术社区  · 16 年前

    我有一个分布式C++应用程序,它由4个进程在2台机器上扩展。其中一个应用程序充当其余应用程序的“控制中心”。

    我希望能够将当前状态保存到文件中,并在以后再次加载。究竟什么是“状态”由系统中的每个模块分别定义。保存时,模块状态应合并到一个文件中。加载时,每个模块都应从文件中读回状态数据。

    状态必须保存到人类可读的文本文件中,因为它将由一些用户编辑。因此,二进制文件格式不是一个选项。此外,首选XML或YAML等标准文件格式。

    您建议如何实现我刚才描述的状态保存/加载的基本框架?我更愿意做此任务所需的最小数据序列化工作。此外,该框架应允许轻松添加更多数据,以便将来保存。

    3 回复  |  直到 16 年前
        1
  •  7
  •   TimW    16 年前

    看一看这本书 boost.Serialize 自由党。这是一个非常好的库,用于将对象(非)流式传输到( xml

    您的类不需要编写加载和保存函数,只需要编写序列化函数,该函数将以两种方式工作。

    class X
    {
       friend class boost::serialization::access;
       template<class Archive>
       void serialize(Archive & ar, const unsigned int version)
       {
           ar & make_nvp("degrees(=xml_tagname)", degrees);
           ar & make_nvp("minutes(=xml_tagname)", minutes);;
           ar & BOOST_SERIALIZATION_NVP(seconds);  // =auto xml tag
       }
    }
    
        2
  •  2
  •   Goz    16 年前

    使用XML。让每个类都有一个Save和Load函数。然后在XML中放置其最高级别的标记作为类的名称。这样,当您重新加载时,可以查找要使用的类,然后创建一个类并调用其加载函数。

        3
  •  1
  •   erelender    16 年前

    我肯定站在XML一边。将每个进程保存的数据封装在进程标识符标记中会很有用。我们在应用程序中使用了一个类似的系统来保存/加载插件中包含的数据,并且它非常方便终端扩展。

    我的第一个方法是:

    1. 控制中心(CC)启动保存。
    2. CC向每个进程发送保存消息
    3. 每一个过程都形成了它自己的一部分 XML,包括其进程标识符,并将其发送给CC
    4. CC收集这些XML片段并 &将其保存到磁盘。

    加载时:

    1. 标识符,发送相应的 将一部分添加到相应的流程中
    2. 每个进程加载自己的部分和 将负载完成信号发送至 复写的副本。
    3. 当所有过程完成时 装载时,CC向其发送启动信号