Meine Vermutung ist, dass Daten im physischen Speicher verstreut sind (sogar die Daten eines Klassenobjekts sind im virtuellen Speicher sequenziell). Um die Daten korrekt zu senden, muss sie also neu zusammengesetzt werden und über die Netzwerk ist ein zusätzlicher Schritt die Transformation der Host-Byte-Reihenfolge in die Netzwerk-Byte-Reihenfolge. Ist es richtig?
Die richtige Serialisierung kann verwendet werden, um Daten an beliebige Systeme zu senden, die möglicherweise nicht in der gleichen Architektur wie der Quellhost funktionieren.
Selbst ein Objekt, das nur aus nativen Typen besteht, kann aufgrund der zusätzlichen Zwischenräume, die unter anderem zwischen und nach Mitgliedern existieren können, mühsam zwischen zwei Systemen geteilt werden. Das Freigeben von Raw-Speicherabbildern von Objekten zwischen Programmen, die für dieselbe Architektur, aber mit unterschiedlichen Compilerversionen kompiliert wurden, kann ebenfalls zu einem großen Ärger werden. Es gibt keine Garantie, wie der variable Typ T tatsächlich im Speicher gespeichert wird.
Wenn Sie nicht mit Zeigern arbeiten (Referenzen eingeschlossen) und die Daten vom selben Binary gelesen werden sollen, wie es ausgegeben wird, ist es in der Regel sicher, nur eine rohe Struktur auf die Festplatte zu schreiben, aber wenn Daten an eine andere gesendet werden Host .. Trommelwirbel Serialisierung ist der Weg zu gehen.
Ich habe gehört, dass Entwickler über Methoden wie das Serialisieren / Deserialisieren von ganzen Zahlen sprechen, und wenn man darüber nachdenkt, ist das nicht weit von der Wahrheit entfernt.
Das Wort " Serialisierung " wird oft verwendet, um diese " komplizierte Methode zum allgemeinen Speichern von Daten " zu beschreiben. Ihre erste Programmieraufgabe, bei der Sie gebeten wurden, Informationen über Hunde in einer Datei zu speichern (hoffentlich * ), machte Gebrauch von der Serialisierung, auf die eine oder andere Weise.
* "hoffentlich" bedeutet, dass Sie die rohe Speicherrepräsentation Ihres ntohl
-Objekts nicht auf Festplatte
Zeiger!
Wenn Sie Speicher auf dem Heap zugewiesen haben, erhalten Sie am Ende einen serialisierten Zeiger, der auf einen beliebigen Speicherbereich zeigt. Wenn Sie nur ein paar ints
und chars
haben, dann ja, Sie können es einfach direkt in eine Datei schreiben, aber das wird dann plattformabhängig wegen der Byte-Reihenfolge, die Sie erwähnt haben.
Zeiger und Datenpaket (Datenausrichtung)
Wenn Sie memcpy
des Speichers Ihres Objekts verwenden, ist es gefährlich, einen Wert für einen wilden Zeiger anstelle seiner Daten zu kopieren. Es gibt ein weiteres Risiko, wenn der Sender und der Empfänger eine andere Datenpaket (Data Align) -Methode haben, werden Sie Müll nach dem Decodieren bekommen.
Binärdarstellungen können sich zwischen verschiedenen Architekturen, Compilern und sogar verschiedenen Versionen desselben Compilers unterscheiden. Es gibt keine Garantie, dass System A, das als signierte Ganzzahl betrachtet wird, auf System B als gleich angesehen wird. Byte-Reihenfolge, Wortlängen, Strukturauffüllung usw. werden schwer zu debuggen sein, wenn Sie das Protokoll oder Dateiformat nicht richtig definieren Austausch der Daten.
(wenn wir von C ++ sprechen) enthält auch virtuelle Methodenzeiger - und sie müssen am Empfangsende rekonstruiert werden.
Tags und Links c c++ serialization