2010-11-10 7 views
11

Kennt jemand eine "Language Level" -Funktion zum Beizen in C++? Ich möchte keine Boost-Serialisierung oder Google-Protokollpuffer. Stattdessen können alle Mitglieder einer Klasse automatisch serialisiert werden (mit der Option, einige Mitglieder auszuschließen, entweder weil sie nicht serialisierbar sind, oder weil es mir einfach nicht wichtig ist, sie für später zu speichern). Dies könnte mit einer zusätzlichen Aktion während der Pars-Zeit erreicht werden, die Code zur Handhabung der automatischen Serialisierung erzeugen würde. Hat jemand von so etwas gehört?Python-Stil Beizen für C++?

Antwort

7

Ich glaube nicht, dass es eine Möglichkeit gibt, dies in einer Sprache ohne Laufzeit-Introspektionsfunktionen zu tun.

+0

Wie Jacob unten sagt, habe ich mich nur gefragt, ob jemand ein kompilierbares Tool gesehen hat, das dieses Problem lösen könnte. Ich denke, da draußen ist nichts dergleichen. –

+0

@RoniChoudhury Wenn ich mich nicht irre, macht die Boost-Serialisierung angesichts der Strenge der Sprache einen guten Job. – Marcin

+0

@Marcin - Boost.Serialize macht in der Tat eine gute Arbeit, aber Sie müssen eine 'serialize()' Funktion schreiben, die die Details des Objekts kennt, das Sie serialisieren möchten. – Ferruccio

1

Es gibt die Standard-C++ - Serialisierung mit den Operatoren < < und >>, obwohl Sie diese für jede Ihrer Klassen implementieren müssen (was so klingt, als ob Sie nicht wollen). Einige Praktizierende sagen, dass Sie diese Operatoren immer umsetzen sollten, obwohl die meisten von uns das selten tun.

3

vielleicht xml Datenbindung? gsoap ist nur eine von vielen Optionen. Sie können automatisch Code für die Zuordnung zwischen Datenstruktur und XML-Schema generieren. Nicht sicher, dass die Einrichtung einfacher wäre als andere Optionen, die Sie erwähnen

0

Ein schneller Weg, dies zu tun, dass ich einmal arbeitete, wenn ich eine Struktur in eine Datei speichern musste, war meine Struktur in eine char-Array zu werfen und zu schreiben es in eine Datei aus. Dann, wenn ich meine Struktur wieder laden wollte, würde ich die gesamte Datei (im Binärmodus) lesen und die ganze Sache auf den Typ meiner Struktur umwandeln. Einfach genug und nutzt die Tatsache, dass Strukturen als zusammenhängender Block im Speicher gespeichert sind. Ich würde nicht erwarten, dass dies mit verwickelten Datenstrukturen oder Hinweisen funktioniert, aber Denkanstoß.

+2

Dies ist sowohl eine alte als auch eine extrem _poor_ Serialisierungsstrategie, die unter verschiedenen Bedingungen spektakulär ausfallen wird, wie: Verschiedene Compiler-Flags, verschiedene Compiler-Versionen, verschiedene CPUs (nicht unbedingt verschiedene Architekturen!), Verschiedene Betriebssysteme ... –

3

etwas, das automatisch alle Mitglieder einer Klasse

Dies ist nicht möglich, in C++ serialisiert werden konnte. Python, C#, Java et al. Verwenden Sie Laufzeit-Introspektion, um dies zu erreichen. In C++ ist das nicht möglich, RTTI ist nicht stark genug.

Im Wesentlichen gibt es nichts in der C++ - Sprache, das es jemandem ermöglichen würde, die Elementvariablen eines Objekts zur Laufzeit zu erkennen. Ohne das können Sie sie nicht automatisch serialisieren.

Verwandte Themen