Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann man Klassen mithilfe des Factory-Musters elegant in einen Stream in C serialisieren?

Wie kann man Klassen mithilfe des Factory-Musters elegant in einen Stream in C serialisieren?

Linda Hamilton
Linda HamiltonOriginal
2024-10-29 02:45:29940Durchsuche

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

Serialisierung in einen Stream für eine entmystifizierte Klasse

Wenn in C eine Objektserialisierung erforderlich ist, greifen viele auf ein bekanntes Muster zurück, das einen Klassen-ID-basierten Wechsel beinhaltet :

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

Obwohl dieser Ansatz intuitiv erscheinen mag, weist er potenzielle Fallstricke auf:

Der Factory-Pattern-Ansatz

Ein eleganterer und erweiterbarer Ansatz Die Lösung besteht darin, das Factory-Muster zu verwenden. Anstatt sich auf Klassen-IDs zu verlassen, erstellt eine Factory-Klasse Objekte basierend auf einem registrierten Satz von Schlüssel-Funktions-Paaren. Die Funktionen geben Instanzen der entsprechenden Klassen zurück.

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

In dieser Implementierung wird jede interessierende Klasse bei der Factory registriert und ihre Klassen-ID einer Erstellungsfunktion zugeordnet. Wenn ein Objekt deserialisiert werden soll, wird die Factory nach der entsprechenden Klassen-ID abgefragt. Wenn es gefunden wird, wird die Erstellungsfunktion aufgerufen, um das Objekt zu instanziieren.

Das obige ist der detaillierte Inhalt vonWie kann man Klassen mithilfe des Factory-Musters elegant in einen Stream in C serialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn