【问题标题】:How to save and load a C++ application state in a modular way如何以模块化方式保存和加载 C++ 应用程序状态
【发布时间】:2010-11-26 18:16:41
【问题描述】:

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

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

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

如我刚才所述,您会建议如何实现用于状态保存/加载的基本框架?我更喜欢做这项任务所需的最少数据序列化工作。此外,该框架应允许轻松添加更多数据以供将来保存。

【问题讨论】:

    标签: c++ session save state resume


    【解决方案1】:

    查看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】:

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

      【讨论】:

        【解决方案3】:

        我绝对站在 XML 一边。将每个进程保存的数据包含在进程标识符标签中会很有用。我们在我们的应用程序中使用类似的系统来保存/加载插件包含的数据,它非常方便可扩展。

        我的第一个方法是这样的:

        1. 控制中心 (CC) 启动保存。
        2. CC 向每个进程发送保存 信号。
        3. 每个进程构成了它自己的一部分 XML 包括其进程标识符并将其发送到 CC
        4. CC 收集这些 XML sn-ps 和 将它们组合成一个大文件 并将其保存到磁盘。

        加载时:

        1. CC 读取 XML 文件。
        2. 遇到进程时 标识符,发送适当的 部分到相应的过程 带有负载信号。
        3. 每个进程加载自己的部分并 发送一个加载完成信号到 抄送。
        4. 所有进程完成后 加载中,CC 向它们发送 Start 信号 然后他们开始正常的工作流程。

        【讨论】:

          猜你喜欢
          • 2018-09-05
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-06
          • 1970-01-01
          • 2013-04-21
          • 1970-01-01
          相关资源
          最近更新 更多