Pregunta

Tengo una aplicación distribuida C ++, que se compone de 4 procesos propagación en 2 máquinas. Una de las aplicaciones sirve como "centro de control" para el resto de las aplicaciones.

Quiero ser capaz de guardar el estado actual en un archivo y cargarlo de nuevo más tarde. ¿Qué es exactamente un "estado" se define por separado por cada módulo en el sistema. Al guardar, los estados módulos se deben combinar en un solo archivo. Cuando la carga, cada módulo debe leer el reverso de datos de estado del archivo.

El estado tiene que ser guardado en un archivo de texto legible por humanos, ya que va a ser editado por algunos usuarios. Por lo que un formato de archivo binario no es una opción. Además, se prefiere un formato de archivo estándar como XML o YAML.

¿Cómo recomendaría implementar un marco básico para el ahorro de estado / carga como acabo de describir? Prefiero hacer el trabajo mínimo de serialización de datos necesarios para esta tarea. Además, el marco debe permitir añadir fácilmente más datos para ser guardado en el futuro.

¿Fue útil?

Solución

Para consultar el boost.Serialize lib. Es un lugar muy agradable para lib (ONU) objetos que fluyen a una ( archivo XML ).

En lugar de escribir una carga y función de ahorro de su clase sólo tiene que escribir una función serialize y esta función funciona en ambos sentidos.

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
   }
}

Otros consejos

El uso de XML. Haga que cada clase tiene una reserva y una función de carga. Luego, en el XML de poner su etiqueta de alto nivel como el nombre de la clase. De esta forma cuando se carga posterior puede buscar qué clase de uso y luego crear uno y pide su función de carga.

Estoy definitivamente en el lado del XML. Encerrando datos guardados por cada proceso en una etiqueta de identificador de proceso será útil. Utilizamos un sistema similar en nuestra aplicación para guardar datos / carga de contenidos por los plugins y es muy conveniente ampliable final.

Mi primer enfoque sería la siguiente:

  1. Centro de Control (CC) iniciados en Guardar.
  2. CC envía cada proceso de la operación de guardar señal.
  3. Cada proceso forma parte de su propia XML incluyendo su identificador de proceso y lo envía a CC
  4. CC reúne estos fragmentos XML y los combina en un archivo de una gran Y lo guarda en el disco.

Cuando carga:

  1. CC lee el archivo XML.
  2. Cuando encuentra un proceso identificador, envía el apropiado parte al proceso correspondiente con una señal de carga.
  3. Cada proceso carga su propia parte y envía una señal completa de carga a la CC.
  4. Cuando se terminan todos los procesos carga, CC les envía la señal de inicio y empiezan a flujo de trabajo normal.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top