2009-09-09 16 views
2

J'ai une application C++ distribuée, composée de 4 processus répartis sur 2 machines. Une des applications sert de "centre de contrôle" pour le reste des applications.Comment enregistrer et charger un état d'application C++ de manière modulaire

Je souhaite pouvoir enregistrer l'état actuel dans un fichier et le charger à nouveau ultérieurement. Quel est exactement un "état" est défini séparément par chaque module dans le système. Lors de la sauvegarde, les états des modules doivent être combinés en un seul fichier. Lors du chargement, chaque module doit lire les données d'état depuis le fichier.

L'état doit être enregistré dans un fichier texte lisible par l'utilisateur, car il va être modifié par certains utilisateurs. Un format de fichier binaire n'est donc pas une option. De plus, un format de fichier standard tel que XML ou YAML est préféré.

Comment recommanderiez-vous de mettre en place un cadre de base pour l'enregistrement/la sauvegarde d'état comme je viens de le décrire? Je préfère effectuer le travail de sérialisation de données minimum requis pour cette tâche. En outre, le cadre devrait permettre d'ajouter facilement plus de données à sauvegarder à l'avenir.

Répondre

7

Regardez le boost.Serialize lib. C'est une très bonne bibliothèque pour (dé) streamer des objets vers un fichier (xml). Au lieu d'écrire une fonction Load and Save, votre classe n'a besoin que d'écrire une fonction de sérialisation et cette fonction fonctionnera dans les deux sens.

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

Utilisez XML. Demandez à chaque classe d'avoir une fonction Enregistrer et Charger. Ensuite, dans le fichier XML, vous mettez sa balise de plus haut niveau comme nom de la classe. Ainsi, lorsque vous rechargez, vous pouvez rechercher la classe à utiliser, puis en créer une et appeler sa fonction Load.

1

Je suis définitivement du côté de XML. L'inclusion de données sauvegardées par chaque processus dans une étiquette d'identification de processus sera utile. Nous utilisons un système similaire dans notre application pour sauvegarder/charger les données contenues dans les plugins et il est très pratique de l'étendre.

Ma première approche serait la suivante:

  1. Control Center (CC) lance sauver.
  2. CC envoie à chaque processus le signal de sauvegarde .
  3. Chaque processus fait sa propre partie de XML, y compris son identifiant de processus et l'envoie à CC
  4. CC rassemble ces extraits XML et les combine en un grand fichier & il enregistre sur le disque.

Une fois le chargement:

  1. CC lit le fichier XML.
  2. Lorsqu'il rencontre un identificateur de processus , envoie la partie appropriée au processus correspondant avec un signal de charge.
  3. Chaque processus charge sa propre pièce et envoie un signal de chargement complet au CC .
  4. Lorsque tous les processus sont terminés , CC leur envoie le signal de démarrage et ils démarrent le flux de travail normal.