2009-09-14 5 views
8

シンプルな方法でC++の構造体をシリアライズする方法を探しています。シリアライゼーションはC++とJava(最低)と32ビット/ 64ビット、ビッグ/リトルエンディアンプラットフォーム直列化される構造体はデータのみを含む。すなわち、状態または動作のない純粋なデータオブジェクトである。クロスプラットフォームと言語(de)シリアライズ

私たちは構造体をオクテットのBLOBにシリアル化して、データベースに "一般的に"保存して後で読むことができるという考えです。したがって、構造体が変更されるたびにデータベースを変更することを避け、各データメンバをフィールドに割り当てることを避けます。つまり、1つのテーブルにすべてを「総称的に」バイナリBLOBとして保持するだけです。これは、開発者にとってはあまり働かなくてはならず、構造が変更されたときに変更を少なくする必要があります

私はboost.serializeを見てきましたが、Javaとの互換性を有効にする方法はないと思います。同様に、JavaでSerializableを継承します。

構造を記述するIDLファイルを既に持っているので、IDLファイルから開始することで可能です。

事前に乾杯!

+1

http://msgpack.org/をご覧ください。クロスプラットフォームと多言語です。 –

答えて

1

なぜXMLを選択していないのですか?これはあなたの要求に完全に適合します。 C++とJavaの両方が簡単に実装できます。

さらに、すべてをデータベースにBLOBとして保存したり、リレーショナルデータベースを使用してデータベースを設計したり、JavaとC++の両方をサポートするオブジェクト指向データベース(http://www.versant.com/en_US/products/objectdatabase)に切り替えることはできません。構造化データのクロスランゲージを渡す -

+1

XMLや他の人が読める形式は、実際には作成されるオーバーヘッドのため、オプションではありません。現在、私たちは1日以内に1TBの生データを1枚のディスクに保存することを検討しています。 XMLの重大なオーバーヘッドは、必要なだけの生データを格納できないことを意味します。 – fwgx

6

は、私は驚いジョンスキートはすでに

Protocol Buffersはかなり多くのシナリオは、この種のために設計されて、この1 :-)に急襲されていませんよ。

つまり、あなたが提案した方法でデータベースを使用しているのであれば、OracleやSQL Serverのような強力なRDBMSではなく、Berkeley DBや1つの軽量なKey-Valueストア多くの「クラウドテーブル」エンジンの

1

ASN.1が必要です。 (これをバイナリXMLと呼んでいる人もいます)ASN.1は非常にコンパクトなため、2つのシステム間でデータを転送するのに理想的です。また、これが使用されていないと考えている人にとって:いくつかのインターネットプロトコルは、データのシリアル化のためのASN.1モデルに基づいています!

残念ながら、ASN.1をサポートするJavaまたはC++用のライブラリは多数ありません。私は数年前にそれを使用しなければならず、C++のASN.1をサポートするための良い、無料の、または安価なツールを見つけることができませんでした。 Objective Systemsで、彼らはASN.1/XMLソリューションを販売していますが、非常に高価です。 (C++とJavaの場合はASN.1 compilerです!)少なくとも腕と脚が必要です! (しかし、あなたはあなたが片手で使うことができるツールを持っています...)

+0

素晴らしいプロジェクトですが、何か高価なものはありません。私は心に留めておきます:) – fwgx

6

私は本当に十字言語に行きたいなら、私は通常、JSONを、JavaScriptのサポートの容易さとabundance of librariesとして提案します。人間が読解可能で変更可能であること(私はXMLのほうが、文字の点ではより小さく、より速く、より読みやすいことがわかります)。しかし、スペースの点で最も効率的ではないし、protocol buffersthriftのような機械可読フォーマットは、そこに利点があるだろう(IDLからの倹約は可能だが、エンコードサービスのために作られているので、あなたが欲しい)。

1

私は、SQLiteデータベースでデータを保存することをお勧めします。構造体はSQLiteテーブルにデータベース行として格納できます。

結果のデータベースファイルは、さまざまなプラットフォーム間でバイナリ互換性があり、メインデータベースにBLOBとして保存できます。私はファイルサイズが同じデータを持つ圧縮されたXMLファイルに匹敵すると信じていますが、処理中のメモリ使用量はXML DOMよりも大幅に少なくなります。

0

Avroもあります。 Apache Thrift、プロトコルバッファ、mesなどの比較については、thisの質問を参照してください。

3

ここで私は非常に似た質問をしました。 6年後、これはあなたには役に立たないかもしれませんが、うまくいけばそれは他人になるでしょう。

多くの選択肢がありますが、残念ながら明確な優勝者はいません(ただし、JSONが明確な勝者であると主張できます)。

他の回答に掲載されている選択肢を忘れないようにしてください。

  • YAML:JSONからすべての二重引用符を差し引いて、インデントを使用します。人間が読むことは可能ですが、効率が悪いことがあります。非常に多くのバリエーションで
  • BSON(バイナリJSON)
  • MessagePack(別の圧縮JSON)

、JSONは、明らかに単純/利便性とクロスプラットフォームのアクセスの点で勝者です。ここ数年、JavaScriptの登場により、さらに人気が高まっています。多くの人が、おそらくこれを事実上の解決策として、それをあまり考えずに使っています(これは私が元々行ったことです:P)。

しかし、サイズが問題になるが、より高度なライブラリを使用したくない場合は、zlibを使用してJSONを圧縮することができます(これは私が今行っていることです) - プラットフォームのアルゴリズム(しかしそれは他のトピック全体です)。

C++でJSON処理を高速化するには、RapidJSONも使用できます。

+0

圧縮はスペースと帯域幅を節約することに注意してください。[ただし、パフォーマンス面ではコストがかかります](http://www.cowtowncoder.com/blog/archives/2009/05/ entry_263.html)。 –

関連する問題