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 &is) { int id; is >> id; switch(id) { case EXAMPLE_ID: return new ExampleClass(is); //... } } void serialize(ostream &os) { os << getClassID(); serializeMe(os); } protected: int getClassID()=0; void serializeMe(ostream &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!