Datenstruktur "schreibbar" machen
-
Hallo,
unter schreibbar verstehe ich sowas wie Serialisierung. Ob es allerdings genau das ist, weiß ich nicht, deswegen nenne ich es nicht so.
Folgendes:
Ich habe eine Datenstruktur, die ich später in einen Stream schreiben möchte und auch wieder zurückverwandeln lassen kann.
Wie geht man das designtechnisch an?
Die Datenstruktur ansich ist ja nur reine Logik und hat nichts mit irgendwelchem Streamingkram zu tun. Also sollte das da nicht rein. Andererseits gehört die Streaminglogik natürlich speziell zu der Datenstruktur.
Aus dem Grund wollte ich jetzt folgendes Konzept benutzen:
DS sei die Datenstruktur (reine Logik). SB sei eine abstrakte Klasse, die Streaming Operationen anbietet.
Nun wollte ich eine Klasse SBDS erstellen, die von beiden Klassen erbt. Damit gäbe es dann immernoch die DS mit reiner Logik, allerdings auch die Datenstruktur, die das Streaming unterstützt.
Allerdings kommt mir das Design irgendwie unsauber vor, ich wüsste aber auch nicht, wie ich das anders lösen soll, weil die Streaming Logik ja noch nicht zur eigentlichen Datenstruktur gehört.
Hat wer 'nen Rat?
-
bei streaming hast du wenig wahl, wenn du es sinnvoll, will heißen so:
quelle >> objekt; ziel << objekt;
anbieten willst. da musst du die streamingoperatoren entweder innerhalb von quell/ziel definieren oder als freistehende funktionen. ersteres bietet sich häufig nicht an, da man bspw in iostream nichts einfügen kann, daher bleibt meist nur die variante über die freistehenden funktionen. womit deine design-frage sich wohl erledigt hätte.
-
Du kannst es komplett entkoppeln, ohne diese (IMO hässliche) Klasse die dir vorschwebt ("SBDS"):
class my_data { public: my_data(int a, int b); int get_a() const; int get_b() const; }; class my_stream { // ... }; template <class D, class S> class my_serializer; template <> class my_serializer<my_data, my_stream> { public: void to_stream(my_stream& stream, my_data const& data) { // ... } my_data from_stream(my_stream& stream) { // ... } };
p.S.: du kannst natürlich auch freie Funktionen machen wie das in der STL üblich ist. operator >> und so.
Ansonsten guck dir mal Boost.Serialization an wie das da gelöst ist. Boost.Serialization hat zwar einige Tücken, aber die betreffen mehr die konkrete Implementierung als das Interface.
-
Oder du verwendest eine Sprache die Reflection unterstuetzt, wie Java mit XStream z.B.:
http://xstream.codehaus.org/tutorial.html
public class Person { private String firstname; private String lastname; // ... constructors and methods } // ... Person joe = new Person("Joe", "Walnes"); String xml = xstream.toXML(joe); // ... Person newJoe = (Person)xstream.fromXML(xml);