C - Serialisierungstechniken
Ich bin ein wenig code schreiben zu serialisieren einige Daten zum senden über das Netzwerk. Derzeit benutze ich dieses primitive Verfahren:
- erstellen Sie eine
void*
Puffer - gelten die byte-Reihenfolge der Operationen wie die
hton
Familie auf die Daten, die ich senden möchten, über das Netzwerk - verwenden
memcpy
kopieren der Speicher in den Puffer - senden Sie den Speicher über das Netzwerk
Das problem ist, dass mit verschiedenen Daten-Strukturen (die oft enthalten, void* data, so dass Sie nicht wissen, ob Sie brauchen, um über die byte-Reihenfolge) der code wird aufgebläht mit Serialisierung-code, der sehr spezifisch für jede Daten-Struktur und kann nicht wiederverwendet werden, an alle.
Was sind einige gute Techniken für die Serialisierung C, dass dies einfacher /weniger hässlich?
-
Hinweis: ich bin gebunden an ein bestimmtes Protokoll, so kann ich nicht frei wählen, wie zum serialisieren meine Daten.
InformationsquelleAutor der Frage ryyst | 2011-05-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für jede Daten-Struktur, eine serialize_X Funktion (wobei X für die struct-name), die einen Zeiger auf ein X und ein Zeiger auf eine undurchsichtige Puffer-Struktur und ruft die entsprechende Serialisierung von Funktionen. Sie liefern sollte, einige primitive wie serialize_int die schreiben in den Puffer und aktualisieren der output-index.
Der primitive wird noch zu nennen so etwas wie reserve_space(N), wobei N die Anzahl von bytes, die erforderlich sind, bevor das schreiben von Daten. reserve_space() realloc void* Puffer, damit es wenigstens so groß, wie es die aktuelle Größe plus N bytes.
Um dies möglich zu machen, die Puffer-Struktur werden müssen, enthalten einen Zeiger auf die tatsächlichen Daten, die index zu schreiben, das nächste byte (output-index) und die Größe, die für Daten reserviert.
Mit diesem system werden alle Ihre serialize_X Funktionen sollte ziemlich einfach sein, zum Beispiel:
Und die framework-code wird so etwas wie:
Aus dieser, es sollte Recht einfach zu implementieren alle serialize_ () - Funktionen, die Sie benötigen.
BEARBEITEN:
Zum Beispiel:
BEARBEITEN:
Beachten Sie auch, dass mein code hat einige potenzielle bugs. Die Größe des Puffer-array gespeichert ist, in ein size_t aber der index ein int ist (ich bin mir nicht sicher, ob size_t ist als einer vernünftigen Typ für index). Auch gibt es keine Bestimmung für den Umgang mit Fehlern und keine Funktion, um freie Puffer, nachdem Sie fertig sind, so müssen Sie dies selbst tun. Ich war damit nur eine demonstration der grundlegenden Architektur, die ich benutzen würde.
InformationsquelleAutor der Antwort jstanley
Ich würde sagen, definitiv nicht versuchen, Sie zu implementieren-Serialisierung selbst. Es ist getan worden, eine Million mal, und Sie sollten die Verwendung einer bestehenden Lösung. z.B. protobufs: https://github.com/protobuf-c/protobuf-c
Es hat auch den Vorteil, dass Sie kompatibel mit vielen anderen Programmier-Sprachen.
InformationsquelleAutor der Antwort Assaf Lavie
Würde es helfen, wenn wir wüssten, was das Protokoll Einschränkungen, aber im Allgemeinen Ihre Möglichkeiten sind wirklich sehr begrenzt. Wenn die Daten so sind, dass Sie eine union von einem byte-array, sizeof(struct) für jede Struktur, die es vielleicht vereinfachen, aber aus Ihrer Beschreibung, es klingt wie Sie haben eine weitere wesentliche problem: wenn Sie bei der übertragung von Zeigern (die Sie erwähnen, void * data) dann werden diese Punkte sehr unwahrscheinlich gültig zu sein, auf der empfangenden Maschine. Warum würden die Daten vorkommt, ist an der gleichen Stelle im Speicher?
InformationsquelleAutor der Antwort Charlie Martin
Schlage ich vor, mit einer Bibliothek.
Da war ich nicht zufrieden mit dem vorhandenen, habe ich die Binn Bibliothek zu machen unser Leben einfacher.
Hier ist ein Beispiel für die Verwendung:
InformationsquelleAutor der Antwort Bernardo Ramos