C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Template Factory -> Iterator ?

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Marco
Guest





PostPosted: Wed Mar 08, 2006 7:06 pm    Post subject: Template Factory -> Iterator ? Reply with quote



Hi Group,
ich beschäftige mich gerade mit der Serialisierung von Objekten. Dazu
habe ich mittlerweile ein für mich ganz brauchbares Design erstellt.
Allerdings hakt es noch an einer Ecke. Ich hoffe ihr könnt mir einen
Tip geben. Nachfolgend stell ich euch kurz mein Design vor:

Jede Klasse die serialisiert werden soll, wird von SerilizableObject
abgeleitet. In der SerilizableObject Klasse wird ein eindeutiger Name
zur Identifikation der abgeleiteten Klasse als std::string gespeichert.
In der abgleiteten Klasse werden zwei Methoden implementiert: serilize
und deserilize. Diese Methoden erwarten als Argument ein Interface vom
Typ ISerilizer. Über das Interface ist es den abgleiteten Klassen
möglich, bei der Serialisierung Standard Datentypen an den Serilizer
zu übergeben oder umgekehrt beim deserialisieren Standard Datentypen
zu lesen. Der Implementierung des Serilizer ist es überlassen, in
welcher Form ( zb Binär oder xml etc ) die Daten gespeichert / gelesen
werden. In dieser Form ist nun nur möglich Klassen zu deserialisieren
deren Instanzen schon existieren. Jetzt habe ich dieses Konzept
erweitert.
Das ISerilizer Interface enthält nun eine weitere Methode, der ein
Interface auf eine Factory übergeben wird. Die Factory Implementierung
ist eine Template Klasse. So kann ich unterschiedliche Basis Klassen,
die wieder von SerilizableObject abgeleitet sind, in der Factory
verwenden. Über das Factory Interface soll die Serilizer
Implementierung die zu serialisierenden Instanzen erzeugen. Die Klassen
werden von der Factory über den eindeutigen Namen der serialisierten
Daten identifiziert. Da es der Implementierung des Serilizers
überlassen ist, in welcher Form der eindeutige Klassen Name
gespeichert wird ( zb als Klartext oder crc Wert ), kann er der Factory
nicht den zu erzeugenden Klassen Namen übergeben. Der umgekehrte Weg
ist denkbar, der Serilizer muss nacheinander alle in der Factory
registrierten Klassen durchlaufen und prüfen, ob der gespeicherte
Klassen Name enthalten ist. Ich hoffe das war bis hierher halbwegs
verständlich ? Smile
Meine Idee war nun dem Serilizer über das Factory Interface eine
Methode zur Verfügung zu stellen, mit der er einen Factory-Iterator
erhalten kann. Mit dem Factory-Iterator könnte er dann alle Klassen
Namen nacheinander prüfen und die passende Instanz erzeugen. Mein
Problem ist nun, das die Factory wie gesagt ein Template ist. Die
registrierten Klassen werden in einer std::map gespeichert:

template <class BaseClass, typename KeyType = int> class TFactory
{
public:
// Typedef für die Creator Funktions Zeiger
typedef BaseClass* ( *creatorFunction )( );

// Typedef für die CreatorMap
typedef std::map<KeyType, creatorFunction> CreatorMap;

/* Snip */
}

Ein Iterator auf die Map wäre somit vom Typ:

CreatorMap::iterator

D.h. in dem Factory Interface müsste jetzt eine virtuelle Template
Methode eingefügt werden, um einen passenden Factory-Iterator
zurückgeben zu können. Das geht natürlich nicht Sad
Meine Frage wär nun, wie komme ich geschickt von der Serilizer
Implementierung an die in der Template Factory registrierten Klassen
Namen ? Kann ich einen Iterator definieren der nicht mehr von den
Template Parametern abhängig ist ? Hat überhaupt jemand verstanden
was ich will ? :)

Gruss
Marco

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Torsten Robitzki
Guest





PostPosted: Thu Mar 09, 2006 5:06 pm    Post subject: Re: Template Factory -> Iterator ? Reply with quote



Hallo Marco,

Marco wrote:
Quote:
Hi Group,
ich beschäftige mich gerade mit der Serialisierung von Objekten. Dazu
habe ich mittlerweile ein für mich ganz brauchbares Design erstellt.
Allerdings hakt es noch an einer Ecke. Ich hoffe ihr könnt mir einen
Tip geben. Nachfolgend stell ich euch kurz mein Design vor:

Jede Klasse die serialisiert werden soll, wird von SerilizableObject
abgeleitet.

Kann man machen, ich habe den Sinn und Vorteil aber noch nie ganz
verstanden. In meiner zu serialisierenden Objekthierarchie werde ich bei
der Verwendung von polymorphen Typen doch wohl eher andere Basisklassen
haben als SerilizableObject (es sei den ich möchte nur Serialisieren
Wink. Aber sei es drum:

Quote:
In der SerilizableObject Klasse wird ein eindeutiger Name
zur Identifikation der abgeleiteten Klasse als std::string gespeichert.

Der eindeutige Name ist doch nicht ein Attribut des Objektes sondern des
Typens, da Du sowieso eine Zuordnung von Namen zu einer Erzeugerfunktion
brauchst, kannst Du auch gleich noch einen Bezug zu einem std::type_info
mit einfügen und würdest dann indirekt über den typeid operator an den
Namen kommen. Oder aber eine virtuelle Funktion std::string name() const;

Quote:
In der abgleiteten Klasse werden zwei Methoden implementiert: serilize
und deserilize.

Das bedeutet immer auch, das die zu deserialisierende Klasse einen
default Konstruktor haben muß. Ich bin ja ein Freund von Konstruieren
aus einem Stream aber das kann man auch als persönliche Vorliebe ansehen.

<ISerilizer>

<Factory>
Quote:
Meine Idee war nun dem Serilizer über das Factory Interface eine
Methode zur Verfügung zu stellen, mit der er einen Factory-Iterator
erhalten kann. Mit dem Factory-Iterator könnte er dann alle Klassen
Namen nacheinander prüfen und die passende Instanz erzeugen. Mein
Problem ist nun, das die Factory wie gesagt ein Template ist. Die
registrierten Klassen werden in einer std::map gespeichert:

template <class BaseClass, typename KeyType = int> class TFactory
{
public:
// Typedef für die Creator Funktions Zeiger
typedef BaseClass* ( *creatorFunction )( );

// Typedef für die CreatorMap
typedef std::map<KeyType, creatorFunction> CreatorMap;

/* Snip */
}

Ein Iterator auf die Map wäre somit vom Typ:

CreatorMap::iterator

oder typedef CreatorMap::const_iterator iterator, const_iterator;
Quote:

D.h. in dem Factory Interface müsste jetzt eine virtuelle Template
Methode eingefügt werden, um einen passenden Factory-Iterator
zurückgeben zu können. Das geht natürlich nicht Sad

Ne, geht nicht; ich sehe aber auch nicht die Notwendigkeit. Der Key
sollte einfach in allen Fällen string bleiben und der Serilizer soll
dann gefälligst für eine Umsetzung von CRC zum Namen sorgen. Ist solch
eine Funktion nicht möglich, so muß man halt einmal über alle Namen
gehen und den CRC Wert im Serilizer cachen.

Quote:
Meine Frage wär nun, wie komme ich geschickt von der Serilizer
Implementierung an die in der Template Factory registrierten Klassen
Namen ?

In dem Du über alle in der Factory registrierten Namen mit der CRC
Funktion gehst, bist Du den gesuchten Wert gefunden hast. Läßt sich
sicher in verschiedenen Stufen optimieren. Gibt es einen Grund für diese
CRC Werte? Wenn es nur darum geht, Platz im Stream zu sparen, kannst
Du auch den Namen nach dem er ein erstes mal geschrieben wurde, bei
jedem weiteren mal durch einen Index ersetzen. Vor jedes Objekt das über
die Factory deserialisiert werden soll wird dann ein Kennung
geschrieben, ob jetzt der volle Name folgt, oder ob nur noch der Index
folgt und der komplette Name bereits einmal früher im Stream geschrieben
wurde.

Quote:
Hat überhaupt jemand verstanden
was ich will ? Smile

Ich hoffe ;-)

mfg Torsten

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Marco
Guest





PostPosted: Sun Mar 12, 2006 12:06 am    Post subject: Re: Template Factory -> Iterator ? Reply with quote



Torsten Robitzki schrieb:

Quote:
Der eindeutige Name ist doch nicht ein Attribut des Objektes sondern des
Typens, da Du sowieso eine Zuordnung von Namen zu einer Erzeugerfunktion
brauchst, kannst Du auch gleich noch einen Bezug zu einem std::type_info
mit einfügen und würdest dann indirekt über den typeid operator an den
Namen kommen. Oder aber eine virtuelle Funktion std::string name() const;

Ja, das ginge aber ich wollte auf RTTI verzichten.

Quote:
Ne, geht nicht; ich sehe aber auch nicht die Notwendigkeit. Der Key
sollte einfach in allen Fällen string bleiben und der Serilizer soll
dann gefälligst für eine Umsetzung von CRC zum Namen sorgen. Ist solch
eine Funktion nicht möglich, so muß man halt einmal über alle Namen
gehen und den CRC Wert im Serilizer cachen.

Und genau dann hat man wieder das Problem -> wie kommt man an die in
der Factory registrierten Klassen Namen heran um den Cache zu füllen ?

Quote:
In dem Du über alle in der Factory registrierten Namen mit der CRC
Funktion gehst, bist Du den gesuchten Wert gefunden hast. Läßt sich
sicher in verschiedenen Stufen optimieren. Gibt es einen Grund für diese
CRC Werte? Wenn es nur darum geht, Platz im Stream zu sparen, kannst
Du auch den Namen nach dem er ein erstes mal geschrieben wurde, bei
jedem weiteren mal durch einen Index ersetzen. Vor jedes Objekt das über
die Factory deserialisiert werden soll wird dann ein Kennung
geschrieben, ob jetzt der volle Name folgt, oder ob nur noch der Index
folgt und der komplette Name bereits einmal früher im Stream geschrieben
wurde.

Ja, das ist die Idee. Ich habe es jetzt so ähnlich gelöst. Ich
übergebe der Factory
keinen string, sondern ein Interface zu einer neuen Klasse vom Typ
ClassNameConverter.
Diese Klasse ist dafür verantwortlich den Klassen Namen zu
konvertieren. Das Interface
enthält nur eine Methode "bool compareClassName( std::string className
)". Die Factory durchläuft nun alle registrieten Klassen und ruft für
jede die compare Methode auf. Bei einem Match wird die Klasse
instanziert. Klappt super !
Dieser Ansatz hat auch den Vorteil das ich nun die Konvertierung des
Klassen Namens
gekapselt habe. Jetzt kann ich auch prima Deine Vorschlag mit der
Indizierung einbringen.

Danke für deine Vorschläge !

Gruss
Marco

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Stephan Rupp
Guest





PostPosted: Sun Mar 12, 2006 4:06 pm    Post subject: Re: Template Factory -> Iterator ? Reply with quote

Hallo Marco!
Irgendwie kommt mir Dein Vorhaben sehr bekannt vor. Kann mich erinnern
auch mal sowas in Angriff genommen zu haben. Allerdings habe ich
irgendwann Abstand von einer eigenen Implementierung genommen und dann
boost benutzt. Die bietet ein recht leistungsfähiges
Serialisierungskonzept an, das auch Objekt-Hierarchien über
Basis-Pointer streamen kann - und soweit ich es richtig in Erinnerung
habe, das Ganze sogar plattformunabhängig. Vielleicht schaust Du Dich
mal da um und kannst - pragmatisch gesehen - Deine Energie vielleicht
besser dahingehend investieren, die Serializer/Deserializer in boost zu
überreden, XML bzw. Dein eigenes Format zu futtern.
Wenn Du es dann um das XML-Streaming erweitert haben solltest, sag mir
mal bitte bescheid ;-)

Gruß,
Stephan

P.S.: Ich glaube, serilize und Serilizer sollten richtigerweise
serialize und Serializer heissen, oder? ;-)

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.