言語に依存しないバイナリ形式でデータをシリアル化する最良の方法は何ですか?
-
02-07-2019 - |
質問
言語に依存しないメカニズムでソケットまたは共有メモリを介して渡されるデータをシリアル化するメカニズムを検討しています。このデータは非常に構造化されており、エンコード/デコード速度が重要であるため、XMLの使用には消極的です。十分にライセンスされた優れたC APIを持つことが重要ですが、理想的には他の言語のトンのサポートがあるはずです。 googleのプロトコルバッファと ASN.1 。私は正しい軌道に乗っていますか?もっと良いものはありますか?独自のパック構造を実装するだけで、標準を探すべきではありませんか?
解決
要件があれば、Google Protocol Buffersを使用します。あなたのアプリケーションに理想的に適しているようです。
他のヒント
XDRを検討できます。 RFC があります。私はそれを使用しましたが、パフォーマンスの問題は一度もありませんでした。 ONC RPCで使用され、rpcgenと呼ばれるツールが付属しています。また、データをシリアル化するだけの場合は、自分でジェネレーターを作成するのも簡単です(移植性の理由で私がやったことは、半日かかりました)。 オープンソースのC実装がありますが、既にシステムライブラリにある可能性があるため、ソースは必要ありません。
ASN.1は常に少しバロックに思えましたが、XDRにはいくつかの制限があるため、実際のニーズに応じてより適切な場合があります。
このミックスにASN.1を挿入したかっただけです。 ASN.1は形式の標準ですが、ほとんどの言語用のライブラリがあり、 asn1c を介したCインターフェイスは非常に多くあります。 プロトコルバッファのCインターフェイスよりもクリーンです。
JSONはこの種のものにとって本当に私のお気に入りです。しかし、私はその中にバイナリのものを使った経験がありません。 JSONの使用を計画している場合は、結果を投稿してください!
Thrift は、Facebookによって作成されたバイナリ形式です。 Googleプロトコルバッファとの比較。
バイナリXML もありませんまだ安定しています。私がリンクしている記事には、興味深いリンクがたくさんあります。
別のオプションは SNAC / TLV です。これはAOLのOscar / AIMプロトコル。
筋肉もご覧ください。かなりの処理を行いますが、バイナリ形式にシリアル化します。
考慮する必要のあるものはほとんどありません
1. Storage
2. Encoding Style (1 byte 2 byte)
3. TLV standards
ASN.1パーサーはバイナリ表現に適しています。最良の部分はASN.1はITU-T内外で広く使用されている確立された技術です。この表記は、多くのソフトウェアベンダーによってサポートされています。