Maison > développement back-end > C++ > Comment sérialiser élégamment des classes dans un flux en C à l'aide du modèle d'usine ?

Comment sérialiser élégamment des classes dans un flux en C à l'aide du modèle d'usine ?

Linda Hamilton
Libérer: 2024-10-29 02:45:29
original
949 Les gens l'ont consulté

How to Elegantly Serialize Classes to a Stream in C   Using the Factory Pattern?

La sérialisation vers un flux pour une classe démystifiée

Face au besoin de sérialisation d'objets en C, beaucoup ont recours à un modèle familier qui implique une commutation basée sur l'ID de classe :

<code class="cpp">class Serializable {
  public:
    static Serializable *deserialize(istream &amp;is) {
        int id;
        is >> id;
        switch(id) {
          case EXAMPLE_ID:
            return new ExampleClass(is);
          //...
        }
    }

    void serialize(ostream &amp;os) {
        os << getClassID();
        serializeMe(os);
    }

  protected:
    int getClassID()=0;
    void serializeMe(ostream &amp;os)=0;
};
Copier après la connexion

Bien que cette approche puisse paraître intuitive, elle souffre de pièges potentiels :

L'approche Factory Pattern

Une approche plus élégante et extensible La solution consiste à utiliser le modèle d'usine. Au lieu de s'appuyer sur des ID de classe, une classe d'usine crée des objets basés sur un ensemble enregistré de paires clé-fonction. Les fonctions renvoient des instances des classes correspondantes.

<code class="cpp">template<typename K, typename T>
class Factory {
    typedef T *(*CreateObjectFunc)();
    std::map<K, CreateObjectFunc> mObjectCreator;

    template<typename S> 
    static T* createObject(){ 
        return new S(); 
    }

    template<typename S> 
    void registerClass(K id){ 
        mObjectCreator.insert( std::make_pair<K,CreateObjectFunc>(id, &createObject<S> ) ); 
    }

    T* createObject(K id){
        typename std::map<K, CreateObjectFunc>::iterator iter = mObjectCreator.find(id); 
        if (iter == mObjectCreator.end()){ 
            return NULL;
        }
        return ((*iter).second)();
    }
};</code>
Copier après la connexion

Dans cette implémentation, chaque classe d'intérêt est enregistrée auprès de l'usine, associant son ID de classe à une fonction de création. Lorsqu'un objet doit être désérialisé, l'usine est interrogée pour connaître l'ID de classe correspondant. Si elle est trouvée, la fonction de création est invoquée pour instancier l'objet.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal