2

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

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

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

正如我刚刚描述的,你会如何推荐实现一个用于状态保存/加载的基本框架?我更喜欢做这项任务所需的最少数据序列化工作。此外,该框架应该允许在将来轻松添加更多要保存的数据。

4

3 回答 3

7

看看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
   }
}
于 2009-09-09T08:23:28.303 回答
2

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

于 2009-09-09T08:17:21.610 回答
1

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

我的第一种方法是:

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

加载时:

  1. CC 读取 XML 文件。
  2. 当它遇到一个进程标识符时,将适当的部分发送给相应的进程,并带有一个加载信号。
  3. 每个进程加载自己的部分并向 CC 发送加载完成信号。
  4. 当所有进程完成加载后,CC 向它们发送 Start 信号,它们开始正常的工作流程。
于 2009-09-09T08:25:48.967 回答