Datenstrukturen in C serialisieren

Lesezeit: 7 Minuten

Benutzeravatar von Daniel Lucraft
Daniel Lucraft

Ich hätte gerne eine C-Bibliothek, die meine Datenstrukturen auf die Festplatte serialisieren und später wieder laden kann. Es sollte willkürlich verschachtelte Strukturen akzeptieren, möglicherweise mit Zirkelbezügen.

Ich nehme an, dass dieses Tool eine Konfigurationsdatei benötigt, die meine Datenstrukturen beschreibt. Die Bibliothek darf die Codegenerierung verwenden, obwohl ich mir ziemlich sicher bin, dass dies auch ohne möglich ist.

Hinweis Ich bin nicht an Datenportabilität interessiert. Ich möchte es als Cache verwenden, damit ich mich darauf verlassen kann, dass sich die Umgebung nicht ändert.

Vielen Dank.


Ergebnisse

Jemand schlug vor Tpl Das ist eine großartige Bibliothek, aber ich glaube, dass sie keine willkürlichen Objektgraphen erstellt, wie z. B. einen Baum von Knoten, die jeweils zwei andere Knoten enthalten.

Ein weiterer Kandidat ist Osteuropäische Zeit, elektronischer Energietransfer, voraussichtliche Flugdauer, ein Projekt des Fenstermanagers Enlightenment. Sieht interessant aus, scheint aber wiederum nicht in der Lage zu sein, verschachtelte Strukturen zu serialisieren.

Kasse tpl. Aus der Übersicht:

Tpl ist eine Bibliothek zum Serialisieren von C-Daten. Die Daten werden in ihrer natürlichen binären Form gespeichert. Die API ist klein und versucht, “aus dem Weg zu gehen”. Im Vergleich zur Verwendung von XML ist tpl schneller und einfacher in C-Programmen zu verwenden. Tpl kann viele C-Datentypen, einschließlich Strukturen, serialisieren.

  • Tpl scheint keine verschachtelten Strukturen zu unterstützen. ZB ein Knoten, der zwei Unterknoten enthalten kann.

    – Daniel Lucraft

    16. Dezember 2008 um 14:47 Uhr

  • Ein weiteres Problem mit tpl ist die eingeschränkte Portabilität von Floats.

    – eadmaster

    22. Dezember 2012 um 7:45 Uhr

dmckee --- Benutzeravatar des Ex-Moderators Kitten
dmckee — Ex-Moderator-Kätzchen

Ich weiß, dass Sie nach einer Bibliothek fragen. Wenn Sie keine finden können (::boggle::, Sie würden denken, dies sei ein gelöstes Problem!), Hier ist ein Lösungsansatz:

Sie sollten in der Lage sein, einen Codegenerator zu schreiben[1] Bäume/Graphen ohne (Laufzeit-)Vorverarbeitung ziemlich einfach zu serialisieren.

Sie müssen die Knotenstruktur analysieren (typedef Behandlung?), und schreiben Sie die enthaltenen Datenwerte direkt, aber behandeln Sie die Zeiger mit einiger Sorgfalt.

  • Für Zeiger auf andere Objekte (z char *name;) welche du kennt einzeln referenziert werden, können Sie die Zieldaten direkt serialisieren.

  • Für Objekte, die möglicherweise mehrfach referenziert werden, und für andere Knoten Ihres Baums müssen Sie die Zeigerstruktur darstellen. Jedem Objekt wird eine Serialisierungsnummer zugewiesen, die anstelle des Zeigers geschrieben wird. Pflegen Sie eine Übersetzungsstruktur zwischen aktueller Speicherposition und Serialisierungsnummer. Wenn Sie auf einen Zeiger stoßen, sehen Sie nach, ob ihm bereits eine Nummer zugewiesen ist, wenn nicht, geben Sie ihm eine und stellen Sie das Objekt für die Serialisierung in die Warteschlange.

Das Zurücklesen erfordert auch einen Übersetzungsschritt für Knotennummer/Speicherort und ist möglicherweise einfacher in zwei Durchgängen durchzuführen: Regenerieren Sie die Knoten mit den Knotennummern in den Pointer-Slots (schlechter Zeiger, seien Sie gewarnt), um herauszufinden, wo jeder Knoten hinkommt setzen, dann die Struktur erneut ablaufen und die Zeiger fixieren.

Ich weiß nichts über tpl, aber Sie können es vielleicht huckepack nehmen.


Das On-Disk-/Netzwerkformat sollte wahrscheinlich mit einigen Typinformationen eingerahmt werden. Sie benötigen ein Namensverstümmelungsschema.


[1] WURZEL verwendet diesen Mechanismus, um eine sehr flexible Serialisierungsunterstützung in C++ bereitzustellen.


Nachtrag: Mir fällt auf, dass dies nicht immer so einfach ist, wie ich oben angedeutet habe. Betrachten Sie die folgende (erfundene und schlecht gestaltete) Deklaration:

enum {
   mask_none = 0x00,
   mask_something = 0x01,
   mask_another = 0x02,
   /* ... */
   mask_all = 0xff
};
typedef struct mask_map {
   int mask_val;
   char *mask_name;
} mask_map_t;
mask_map_t mask_list[] = {
   {mask_something, "mask_something"},
   {mask_another, "mask_another"},
   /* ... */
};
struct saved_setup {
   char* name;
   /* various configuration data */
   char* mask_name;
   /* ... */
};

und nehmen an, dass wir initialisieren struct saved_setup Artikel damit mask_name weist auf mask_list[foo].mask_name.

Wenn wir die Daten serialisieren, was machen wir damit struct saved_setup.mask_name?

Sie müssen Ihre Datenstrukturen sorgfältig entwerfen und/oder einige fallspezifische Informationen in den Serialisierungsprozess einbringen.

  • Danke für ein tolles Schreiben. Ich hatte im Wesentlichen diesen Plan als „Existenzbeweis“ der Bibliothek im Kopf. Die Theorie besagt, dass jede Bibliothek, die man sich in C vorstellen kann, geschrieben wurde. Kann nicht glauben, dass es sich herausstellt, dass es nicht existiert. Ich könnte versuchen, dieses Ding über Weihnachten zu schreiben.

    – Daniel Lucraft

    17. Dezember 2008 um 8:15 Uhr

Benutzeravatar von Amith Chinthaka
Amith Chinthaka

Das ist meine Lösung. Es verwendet meine eigene Implementierung von malloc, free und mmap, munmap Systemaufrufen. Folgen Sie den angegebenen Beispielcodes. Ref: http://amscata.blogspot.com/2013/02/serialize-your-memory.html

In meinem Ansatz erstelle ich ein Char-Array als meinen eigenen RAM-Speicherplatz. Dann gibt es Funktionen, um den Speicher zuzuweisen und ihn freizugeben. Nachdem Sie die Datenstruktur erstellt haben, verwenden Sie mmapschreibe ich das char-Array in eine Datei.

Wann immer Sie es wieder in den Speicher laden möchten, gibt es eine Funktion, die verwendet wird munmap um die Datenstruktur wieder in das char-Array zu legen. Da es virtuelle Adressen für Ihre Zeiger hat, können Sie Ihre Datenstruktur wiederverwenden. Das heißt, Sie können eine Datenstruktur erstellen, speichern, laden, erneut bearbeiten und erneut speichern.

  • Dies funktionierte sogar für verschachtelte Baumstrukturen sehr gut, obwohl einige Änderungen am Code erforderlich waren, um ihn zu kompilieren. Fehlendes include für ‘time.h’ und eine vermutete Typedef für ushort, was kein Standard der Sprache ist.

    – danni

    17. März 2017 um 17:35 Uhr

  • Es verarbeitet jedoch keine Zeigerarrays, sodass eine Graphstruktur, die diese enthält, nicht korrekt serialisiert wird, sondern nur der erste Zeiger serialisiert wird.

    – danni

    17. März 2017 um 17:35 Uhr


Kann man sich anschauen osteuropäische Zeit, elektronischer Energietransfer, voraussichtliche Flugdauer. Eine Bibliothek des Enlightenment-Projekts zum Speichern von C-Datentypen (einschließlich verschachtelter Strukturen). Obwohl sich fast alle Bibliotheken des Enlightenment-Projekts im Pre-Alpha-Stadium befinden, ist eet bereits veröffentlicht. Ich bin mir jedoch nicht sicher, ob es Zirkelbezüge verarbeiten kann. Wahrscheinlich nicht.

http://s11n.net/c11n/

HTH

  • Die Verbindung ist unterbrochen.

    – Trevor Hickey

    18. Januar 2017 um 19:39 Uhr

  • Funktioniert jetzt. Titel “libc11n: a serialization library/framework for C”, sf link: sourceforge.net/projects/s11n

    – Kuppel

    15. März 2017 um 14:05 Uhr

Benutzeravatar von gngrwzrd
gngrwzrd

Sie sollten gwlib auschecken. Der Serializer/Deserializer ist umfangreich. und es stehen umfangreiche Tests zur Ansicht bereit. http://gwlib.com/

  • Die Verbindung ist unterbrochen.

    – Trevor Hickey

    18. Januar 2017 um 19:39 Uhr

  • Funktioniert jetzt. Titel “libc11n: a serialization library/framework for C”, sf link: sourceforge.net/projects/s11n

    – Kuppel

    15. März 2017 um 14:05 Uhr

Benutzeravatar von Jonathan Leffler
Jonathan Leffler

Ich gehe davon aus, dass Sie über das Speichern einer Diagrammstruktur sprechen, wenn nicht, dann ignorieren Sie …

Wenn Sie ein Diagramm speichern, denke ich persönlich, dass die beste Idee die Implementierung einer Funktion wäre, die Ihr Diagramm in eine Adjazenzmatrix umwandelt. Sie können dann eine Funktion erstellen, die eine Adjazenzmatrix in Ihre Diagrammdatenstruktur umwandelt.

Dies hat drei Vorteile (die in Ihrer Bewerbung von Bedeutung sein können oder auch nicht):

  • Adjazenzmatrix sind eine sehr natürliche Art, ein Diagramm zu erstellen und zu speichern
  • Sie können eine Adjazenzmatrix erstellen und diese in Ihre Anwendungen importieren
  • Sie können Ihre Daten sinnvoll speichern und auslesen.

Ich habe diese Methode während eines CS-Projekts verwendet und würde es definitiv wieder tun.

Hier können Sie mehr über die Adjazenzmatrix lesen: http://en.wikipedia.org/wiki/Modified_adjacency_matrix

  • Ich spreche nicht von einer Graphenstruktur in diesem Sinne. Meine Strukturen ähneln eher einem Baum, obwohl ich Zirkelbezüge nicht ausschließen möchte. Es gibt keinen Grund, warum eine C-Bibliothek das nicht ohne Verarbeitung in meinem Namen serialisieren kann.

    – Daniel Lucraft

    16. Dezember 2008 um 14:50 Uhr

  • Ein Baum ist nur ein Sonderfall eines Graphen, und mit Zirkelbezügen könnte man argumentieren, dass Sie tatsächlich einen Graphen und keinen Baum haben.

    – mmattax

    16. Dezember 2008 um 15:15 Uhr

  • Gut: Alle C-Datenstrukturen können wie in Speichergraphen betrachtet werden. Gibt es jetzt eine Bibliothek, die diese Daten serialisieren kann?

    – Daniel Lucraft

    16. Dezember 2008 um 15:19 Uhr

1404610cookie-checkDatenstrukturen in C serialisieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy