Cross-Plattform und Sprache der (de -) Serialisierung
Ich bin auf der Suche nach einem Weg zu serialisieren, die eine Reihe von C++ - Strukturen in der bequemste Weg, so dass die Serialisierung ist portabel C++ und Java (mindestens) und über 32bit/64bit, big - /little-endian-Plattformen. Die Strukturen serialisiert werden nur die Daten enthalten, d.h. Sie sind Reine Daten-Objekte ohne Zustand oder Verhalten.
Die Idee, dass wir serialisieren die Strukturen in einem Oktett blob, das können wir in einer Datenbank speichern "allgemein" und Lesen Sie später auf. So wird vermieden, ändern Sie die Datenbank immer dann, wenn eine Struktur, die Veränderungen und auch die Vermeidung der Zuordnung jedes Daten-Mitglied zu einem Feld, d.h. wir wollen nur eine Tabelle zu halten, alles, was "generisch" als binary-blob. Das sollte weniger Arbeit für die Entwickler und benötigen weniger ändert, wenn die Strukturen ändern.
Habe ich mir angeschaut-boost.serialisieren, aber glaube nicht, dass es einen Weg gibt, damit Kompatibilität mit Java. Und auch für Erben von Serializable in Java.
Ob es einen Weg gibt, es zu tun, indem Sie von einer IDL-Datei, am besten wäre, da wir bereits über IDL-Dateien, beschreiben die Strukturen.
Cheers im Voraus!
- Look at msgpack.org es ist cross-Plattform-und multi-Sprache.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin überrascht, Jon Skeet hat sich nicht schon stürzten sich auf dieses 🙂
Protocol Buffers ist ziemlich viel für diese Art von Szenario -- die Weitergabe der strukturierten Daten cross-Sprache.
Sagte, dass, wenn Sie eine Datenbank, die Art und Weise, die Sie vorschlagen, sollten Sie wirklich nicht sein, mit einem full-Stärke-RDBMS wie Oracle oder SQL Server, aber eher ein leichtes Schlüssel-Wert-Speicher, wie Berkeley-DB-oder eine der vielen "cloud table" - Motoren.
Wenn ich gehen wollen wirklich, wirklich cross-Sprache, die ich normalerweise würde vorschlagen, JSON, als die einfache javascript-Unterstützung und einer fülle von Bibliotheken, als auch von Menschen lesbar und änderbar (ich bevorzuge es, XML-da finde ich es kleiner in Bezug auf die chars, schneller und besser lesbar). Es ist nicht die effizienteste in Bezug auf Raum, jedoch, und eine weitere Maschine lesbaren format wie protocol buffers oder Sparsamkeit hätte Vorteile gibt es (Sparsamkeit kann man aus einem IDL, aber es ist auch für die Codierung von Leistungen, so könnte es schwerer sein, als Sie wollen).
Stolperte ich hier, mit einer sehr ähnlichen Frage. 6 Jahre später, ist dies möglicherweise nicht nützlich für Sie, aber hoffentlich wird es für andere.
Gibt es eine Menge alternativen, leider mit keine klare Gewinner (obwohl man argumentieren könnte, dass JSON ist der klare Sieger). Auch hat Google mehrere konkurrierende Technologien (alle von Ihnen offenbar wird intern verwendet):
Nicht zu vergessen sind die alternativen gepostet, in dem anderen Antworten. Hier sind ein paar mehr:
Mit so vielen Variationen, JSON ist eindeutig der Sieger in puncto Einfachheit/Bequemlichkeit und cross-Plattform-Zugang. Es hat gewonnen, auch mehr Popularität in den letzten paar Jahren, mit dem Aufkommen von JavaScript. Eine Menge Leute wahrscheinlich verwenden, als eine de-facto-Lösung, ohne es zu viel darüber nachzudenken (das ist das, was ich ursprünglich gemacht habe :P).
Jedoch, wenn die Größe ein Problem wird, sondern Sie lieber Dinge einfach zu halten und nicht verwenden Sie eine der weiter fortgeschrittenen Bibliotheken, Sie konnte nur komprimieren JSON mit
zlib
(das ist, was ich jetzt mache), oder einige andere cross-Plattform-Algorithmus (aber das ist ein ganz anderes Thema).Beschleunigen JSON-handling in C++ könnte man auch verwenden RapidJSON.
Warum haben Sie nicht gewählt, XML, da dieses perfekt auf Ihren Bedarf. C++ - und Java sorgen für eine einfache Umsetzung.
Außerdem bezweifle ich, dass deine Idee von speichern alles als blob in der Datenbank, die Verwendung einer relationalen Datenbank, was eine Datenbank ist konzipiert für die oder-Schalter, um einige objektorientierte Datenbank wie http://www.versant.com/en_US/products/objectdatabase unterstützt sowohl Java als auch C++.
Müssen Sie ASN.1! (Manche Leute bezeichnen dies als binary XML.) ASN.1 ist sehr kompakt und somit ideal zum übertragen von Daten zwischen zwei Systemen. Und für diejenigen, die denken, dass dies nicht immer genutzt: mehrere Internet-Protokolle basieren auf ASN.1 Modell für die Daten-Serialisierung!
Leider gibt es nicht viele Bibliotheken verfügbar für Java oder C++, werden mit Hilfe des ASN.1. Ich war es vor einigen Jahren und konnte einfach nicht finden, eine gute, Kostenlose oder kostengünstige Werkzeug-Unterstützung für die ASN.1 in C++. Bei Ziel-Systeme Sie verkaufen ASN.1/XML-Lösungen, aber es ist extrem teuer. (Die ASN.1 compiler für C++ und Java, das ist!) Es kostet Sie einen arm und ein Bein mindestens! (Aber dann haben Sie ein tool, das Sie verwenden können, mit nur einer hand...)
Ich würde vorschlagen, speichern Sie die Daten mit SQLite Datenbank. Die Strukturen können gespeichert werden als Datenbank-Zeilen in der SQLite-Tabellen.
Die resultierende Datenbank-Datei ist Binär-kompatibel, das über viele verschiedene Plattformen und können gespeichert werden als BLOB in der Datenbank. Ich glaube, die Datei-Größe ist vergleichbar mit komprimierten XML-Datei mit den gleichen Daten, aber die Speicherauslastung während der Verarbeitung werden deutlich weniger als XML-DOM.
Gibt es auch Avro. Schauen diese Frage zum Vergleich von Apache thrift, protocol buffers, mes und so weiter.