Thread serial, dump - Komplexe Datenstrukturen speichern und ausgeben (12 answers)
Opened by mika at 2012-03-03 14:55

rosti
 2012-03-04 09:53
#156601 #156601
User since
2011-03-19
3211 Artikel
BenutzerIn
[Homepage]
user image
Quote
@rosti (Stichwort: Serialize-Algorithmen): Du schlägst also vor das ich "Marker setze" anhand derer ich beim einlesen wieder erkenne wann eine Liste und dann die einzelnen Werte anfangen/aufhören und dies dann Byte-weise abspeichere. Verstehe ich das richtig?


Nein ;)

Beim Serialisieren von Daten in Byte-Sequenzen wird mit Längenangaben gearbeitet, nicht mit 'Marker' oder Tokens.

Entscheidend für die Umkehrung (deserialize) ist, dass jede Längenangabe eine konstante Anzahl an Bytes haben muss, dies ermöglichst die pack() Funktion mit einer geeigneten Schablone. Mit Schablone "N" hat z.B. jede numerische Längenangabe (integer) genau 4 Bytes.

Eine serialisierte Liste könnte z.B. wie folgt in einer Sequenz abgelegt sein:

[bbbb]foo[bbbb]bar[bbbb]baz[bbbb]fox

wobei [bbbb] ist die jeweilige Längenangabe für das folgende Listenelement.

Deserialize: Mit read() werden 4 bytes gelesen, nach unpack() steht die Länge für das folgende Listenelement fest, dann werden diese 3 bytes gelesen ('foo') und danach wiederholt sich das.

Serialize
Code (perl): (dl )
1
2
use bytes; # wichtig für length()
$handle->print(pack("N", length($_)).$_) for @liste;


Beim Entwurf solcher Algorithmen also immer den Umkehrprozes im Hinterkopf behalten.

--Rosti
Last edited: 2012-03-04 09:54:44 +0100 (CET)

View full thread serial, dump - Komplexe Datenstrukturen speichern und ausgeben