Maison  >  Article  >  développement back-end  >  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
Linda Hamiltonoriginal
2024-10-29 02:45:29941parcourir

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

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>

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!

Déclaration:
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