Objekt binär speichern
-
Die hier genannten Loesungen sind uebrigens nicht plattformunabhaengig.
Das ist auch der Grund, warum Microsoft bei C# XML-Dateien verwendet.
Man kann sich mit einigem Aufwand ein Serialisierungs-Framework schreiben, das Objekte z.B. plattformunabhaengig in echte Binaerdaten umwandelt oder auch in XML.
Serialisierung ist leider noch kein Standardfeature der C++ Library.
-
Power Off schrieb:
Die hier genannten Loesungen sind uebrigens nicht plattformunabhaengig.
wo ist meine plattformabhängig?
Das ist auch der Grund, warum Microsoft bei C# XML-Dateien verwendet.
nein. ms benutzt es, weil es ein schönes buzz-word ist.
Man kann sich mit einigem Aufwand ein Serialisierungs-Framework schreiben, das Objekte z.B. plattformunabhaengig in echte Binaerdaten umwandelt oder auch in XML.
aber nicht plattformunabhängig. und wozu?
Serialisierung ist leider noch kein Standardfeature der C++ Library.
zum glück.
-
volkard schrieb:
wo ist meine plattformabhängig?
Das Lesen und Schreiben von Zahlen in ASCII-Form unterliegt auch den Beschraenkungen der jeweiligen Datentypen.
Das Schreiben von "\n" fuehrt auf einem Windows-Rechner (bei Textdateien) dazu, dass "\r\n" geschrieben wird. Beim Einlesen auf einer UNIX-Maschine (wo es nur Binaerdateien gibt) fuehrt zu einem Fehler, weil "\r" im Eingabestrom ist.
volkard schrieb:
nein. ms benutzt es, weil es ein schönes buzz-word ist.
Nein, weil es einfacher zu handhaben ist. Man nehmem einen Texteditor und schon kann man die Daten aendern, ohne einen Spezialeditor fuer eine evtl. Binaerdatei schreiben zu muessen. Jedoch brauchen Binaerdateien weniger Platz. Ein MS-Entwickler sagte mal ueber SOAP: "Toll, jetzt wissen wir endlich, womit wir zukuenftige Terabyte-Festplatten zuballern koennen.
"
volkard schrieb:
Power Off schrieb:
Man kann sich mit einigem Aufwand ein Serialisierungs-Framework schreiben, das Objekte z.B. plattformunabhaengig in echte Binaerdaten umwandelt oder auch in XML.
aber nicht plattformunabhängig. und wozu?
Doch. Binaerdaten lassen sich plattformunabhaengig speichern:
void write_uint32( ubyte_t* buf, uint32_t src ) { buf[0] = (ubyte_t) ( src >> UINT32_C(24) ) & UBYTE_C(0XFF); buf[1] = (ubyte_t) ( src >> UINT32_C(16) ) & UBYTE_C(0XFF); buf[2] = (ubyte_t) ( src >> UINT32_C( 8) ) & UBYTE_C(0XFF); buf[3] = (ubyte_t) ( src ) & UBYTE_C(0XFF); }
(Uebrigens, "& UBYTE_C(0XFF)" schliesst auf Maschinen mit char's groesser als 8 Bit aus, dass die oberen Bits gesetzt sind)
volkard schrieb:
Power Off schrieb:
Serialisierung ist leider noch kein Standardfeature der C++ Library.
zum glück.
Leider.
Wuerde der Welt eine Menge *******-Code ersparen.
-
Da gibts doch was von Boost?!
-
Power Off schrieb:
Leider.
Wuerde der Welt eine Menge *******-Code ersparen.ja. deine parser!
-
volkard schrieb:
ja. deine parser!
Oh, Du hast ja noch gar keinen richtigen von mir gesehen ...
-
man kann sich aber schon sehr gut vorstellen wie die aussehen.
-
hellseher schrieb:
man kann sich aber schon sehr gut vorstellen wie die aussehen.
Na ja, Du weisst ja alles.
-
Wenns auf geschwindigkeit ankommt, und der Pladdenplatz nur 2. rangig ist, wuerd ich definitiv immer mit festen blockgreossen arbeiten ...
class Mitarbeiter { private: string name; string adresse; int alter; float gehalt; // ... }
wuerde erst mal zu
class Mitarbeiter { private: char name[MAXSTRINGLENGTH]; char adresse[MAXSTRINGLENGTH]; int alter; float gehalt; // ... }
werden ... das kannst dan schoen blockweisse lesen und schreiben und mit relativen positionen auf dem binaeren file rumrutschen ....
wenn auf die positionierung verzichtest, oder mit temp files arbeitest, oder ne position / compression selber implementierst ... kannst auch gleich das zippen "mitprogrammieren"
Wenn du instanzen unterschiedlicher klassen mit unterschiedlichen Groessen hasst solltes die Abhaengigkeiten datanbank-like in indizies auslagern, und beim ein auslesen die verbindungen aufbauen ...
meist liest schreibst dann in mehreren schritten, wo die objecte im speicher teilweise mehrmals gewandelt werden .... mit nem mehr oder weniger komplexen cache mechanismus (richtig kompliziert wirds, wenn deine datenstruktur selbst im "geparsten" zustand nimmer in den heap/freestore passt)
Ciao ...
-
RHBaum schrieb:
Wenn du instanzen unterschiedlicher klassen mit unterschiedlichen Groessen hasst solltes die Abhaengigkeiten datanbank-like in indizies auslagern, und beim ein auslesen die verbindungen aufbauen ...
Kannst du mir das mit der Datenbank bitte etwas genauer erklären? Wie würdest du eine aufbauen?