6 Stimmen

Beste Methode zur Serialisierung einer C-Struktur, die von Java deserialisiert werden soll, usw.

Derzeit speichere und lade ich einige Daten in C/C++-Strukturen in Dateien mit fread()/fwrite(). Das funktioniert ganz gut, wenn ich innerhalb dieser einen C-Anwendung arbeite (ich kann neu kompilieren, wenn sich die Struktur ändert, um die sizeof()-Argumente für fread()/fwrite() zu aktualisieren), aber wie kann ich diese Datei in anderen Programmen laden, ohne im Voraus die sizeof()s der C-Struktur zu kennen?

Insbesondere habe ich diese andere Java-Anwendung geschrieben, die die Daten in dieser C-Struktur-Binärdatei enthält visualisiert, aber ich möchte eine allgemeine Lösung, wie diese Binärdatei zu lesen. (Anstatt dass ich die sizeof()s in den Java-App-Quellcode manuell eingeben muss, wenn sich die C-Struktur ändert...)

Ich denke an die Serialisierung zu Text oder XML einer Art, aber ich bin nicht sicher, wo mit, dass zu beginnen (wie in C serialisieren, dann wie in Java und möglicherweise andere Sprachen in der Zukunft deserialize), und wenn das hier ratsam ist, wo ein Mitglied der Struktur ein Float-Array ist, die nach oben von ~50 MB im Binärformat gehen kann (und ich habe Hunderte von diesen Datendateien zu lesen und zu schreiben).

Die C-Struktur ist einfach (keine strenge Verschachtelung oder Zeigerreferenzen) und sieht wie folgt aus:

struct MyStructure {
    char *title;
    int id;
    int param1;
    int param2;
    float *data;
}

Der Teil, der sich am meisten ändern kann, sind die Parameter-Integer.

Welche Möglichkeiten habe ich hier?

4voto

Maurice Perry Punkte 32127

Sie können das Java DataInput/DataOutput-Format verwenden, das gut beschrieben in der Javadoc .

0 Stimmen

Ein großes Problem bei DataInput/DataOutput ist, dass sie Multi-Byte-Daten im Big-Endian-Format lesen/schreiben. Dies gilt auch für java.io.RandomAccessFile. Glücklicherweise können Sie java.io.ByteBuffer verwenden, um im Little Endian Format zu lesen/schreiben. Sie können sogar .order(ByteOrder.LITTLE_ENDIAN) und .order(ByteOrder.BIG_ENDIAN) verwenden, um während eines Streams zwischen den Formaten zu wechseln.

4voto

Kent Boogaart Punkte 170094

Wenn Sie die Kontrolle über beide Codebasen haben, sollten Sie die Verwendung von Protokollpuffer .

0 Stimmen

Einverstanden (aber da ich eine C#-Version von protocol-buffers betreibe, bin ich vielleicht voreingenommen). Zur Info, die wichtigsten C (nicht C++) Version ist, AFAIK, code.google.com/p/protobuf-c

3voto

Jay Punkte 12869

Werfen Sie einen Blick auf JSON. http://www.json.org . Wenn Sie von javascript gehen, ist es eine große Hilfe. Ich weiß nicht, wie gut die Java-Unterstützung ist aber.

1voto

Andy White Punkte 83877

Wenn sich Ihre Struktur nicht (viel) ändert und Ihre Daten in einem ziemlich einheitlichen Format vorliegen, können Sie die Werte einfach in eine CSV-Datei oder ein anderes einfaches Format schreiben.

Dies kann leicht in Java gelesen werden, und Sie müssen sich nicht um die Serialisierung in XML kümmern. Manchmal ist eine einfache Lösung der einfachste Weg.

1voto

Josh Punkte 16859

Werfen Sie einen Blick auf Dienstleistungen von Resin Hessian/Burlap . Möglicherweise möchten Sie nicht den gesamten Dienst, sondern nur einen Teil der API und ein Verständnis für das Leitungsprotokoll.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X