向直列化vs googleプロトコルバッファ?[定休日]
-
21-08-2019 - |
質問
は誰でも経験者がこれらのライブラリにコメントをい。があったのパフォーマンスの違いは困難です。
解決
私は何も深刻、ちょうどいくつかの簡単なハックのもの両方のシステム、と少し周りをプレイしましたが、私はあなたがライブラリを使用することになっている方には実質的な違いがあることを感じました。
は、ブースト::シリアル化すると、あなたがあなた自身の構造体/クラスが最初に書き込み、次にアーカイブメソッドを追加しますが、あなたはまだかなり「スリム」クラスが残っている、それは、データメンバとして使用することができ、継承されたものは何でもます。
プロトコル・バッファーで、でもシンプルな構造のために生成されたコードの量がかなり充実して、発生しています構造体とコードはより上で動作するためのものです、そしてあなたは、あなたからのデータを転送するためのプロトコル・バッファー機能を使用すること独自の内部構造ます。
他のヒント
私は長い時間のためにブーストシリアル化を使用して、ちょうどプロトコルバッファに掘った、と私は、彼らが完全に同じ目的を持っていないと考えてきました。 PBは、あなたがから/に読み出さ交換フォーマットであるのに対し、BSは、ストリームにあなたのC ++オブジェクトを保存します(今後はことを見ませんでした)。
PBのデータモデルは、道に簡単です:あなたはint型と浮動小数点数、文字列、配列、基本的な構造のすべての種類を取得し、それはかなりそれです。 BSは、あなたが直接ワンステップで、あなたのすべてのオブジェクトを保存することができます。
これは、プロトコル・バッファーがよりコンパクトですが、アーカイブを読んだ後に行うことがより多くの仕事があるのに対し、あなたがワイヤ上のより多くのデータを取得するが、あなたは、オブジェクト構造体のすべてを再構築する必要はありませんBSとの意味します。名前が言うように、一方が他方の直列化され、プロトコル(言語に依存しない、スペース効率のよいデータの受け渡し)のためである(誰でも思いつきそうオブジェクトは保存)。
それでは、あなたにとってより重要である:スピード/スペース効率やクリーンなコード
?カップルの追加と進みました。直列化で、ちょっとミックスに追加します。警告:まったく泳げないんだけど---直接体験プロトコルのバッファーを超えて上澄みのdocsに入ります。
ることに注意してくださいあげます。直列化は、素晴らかでないという結論をデフォルトのアーカイブ形式が付属していないための素晴らしい選択肢ワイヤー形式です。
この区別バージョン クラス (お部屋はとても答えが進みました。直列化では一部の支援のためのデータバージョン)と互換性の異なるバージョン 直列化図書館.
新しいバージョンのもの。直列化 が発生しないアーカイブが以前のバージョンでは直列化復元. の逆は成り立ちません:新しいバージョンは常に直列化復元アーカイブした古いバージョン).これは、以下の問題にしています。
- クライアント&サーバーソフトウェアを直列化されたオブジェクトのその他の消費まで移動できる新しい効果がある。直列化合への更新を行っています。クライアントとサーバの両方にロックステップ.(この設計は極めて難しい課題がん制御がクライアントから依頼を受け).
- Boostず一つとして大きな図書館との共通部分の直列化コードおよびその他の部品のboostライブラリ(例えばshared_ptr)を使用すると、同じファイルできるようになアップ 他の パーツの力ではできないアップが進みました。直列化します。いい/安全/codeめのリンクに複数のバージョンの向上を単一の実行、また予算のエネルギーをrefactor出するビットの状態を維持する必要性は、古いバージョンの向上を他の独立した実行可能(DLLに大事になります。
- 旧バージョンの強いこだわった上に対応しておりませんの最新バージョンのコンパイラを使用していまをもらっていないので、こだわった古いバージョンのコンパイラです。
Googleかび上がるような 公開のプロトコルのバッファーワイヤー形式, 、Wikipedia記述して 送対応で、下位互換 がんはWikipediaを参考にデータバージョンではなくプロトコルのバッファの図書館バージョン管理).なにもならないことは保証の送-互換性のように思われます強く表示。
要約 いうも知られる、ワイヤー形式 のようなプロトコルバッファがんのクライアン&サーバーにロックステップ.
脚注:恥知らずのプラグインのための 関連する回答 だけです。
ブSerialisation
- 図書き込みデータストリームです。
- な圧縮データです。
- データ属性をサポートしないバージョン管理ます。
- ポSTL。
- 特性データの記述に依存ムの選択などエンディアン、圧縮).
プロトコルのバッファー
- をコードからのインタフェースの説明(支C++、PythonとJavaのデフォルトです。C、C#によると、3)にわたって
- 任意の圧縮データです。
- 取り扱うデータバージョン管理ます。
- ハエンディアンを入れ替えの間です。
- なSTL。
ブserialisationは図書館に変換するオブジェクトへのserialisedストリームのデータです。プロトコルバッファと同じことを行ない、また、他のおまかせください(バージョン管理と、エンディアンを入れ替え).ブserialisationが簡素化された"小さな単純なタスク".プロトコルバッファは、多くの"大きなインフラ".
編集:24-11-10:さらに、"自動"にBSバージョン管理.
私の経験のない力を直列化で使ったプロトコルバッファ.私のようなプロトコルバッファ。以下のことに注意してください(これを言うと 知識が無 ブースト).
- プロトコルバッファは非常に効率的になっ 想像 られるのは、深刻な問題に対すが進みました。
- プロトコルのバッファーを中間表現する作品と他言語のPython、Java...以上の作品を表現)をする場です。まっている場合をご利用いただけるC++かげでより良いものを使用するオプションを他の言語も素敵になっています。
- プロトコルバッファのようなデータコンテナ...なオブジェクト指向など自然の継承関係を示します。を考える構造がどのようにしたいserialize.
- プロトコルバッファ柔軟にできるので、追加"オプション"を指定する必要があります。これは、基本的には手段で変更できる構造のプロトコルのバッファを崩さずに対応しています。
武器agiは、dexで下がらないboxerぐ.
boost.serializationはちょうどC ++コンパイラを必要とし、あなたに
のようないくつかのシンタックスシュガーを与えますserialize_obj >> archive;
// ...
unserialize_obj << archive;
の保存と読み込みのために。 C ++は、唯一の言語である場合は、あなたが深刻な打撃をboost.serialization与える必要があります。
私はGoogleのプロトコルバッファで高速に見ていました。私が見るものから私はboost.serializationへの直接比較することはできないと思います。あなたのツールチェーンに.protoファイル用のコンパイラを追加し、.protoファイル自体を維持する必要があります。 boost.serializationがするように、APIはC ++に組み込まれません。
boost.serializationは、その非常によくのために仕事を設計したん:C ++オブジェクトをシリアル化するために:) 大藤Googleのプロトコル・バッファーのようなクエリ-APIを使用すると、より多くの柔軟性を提供しています。
私はこれまでのところ、私はパフォーマンスの比較にコメントすることはできませんboost.serializationを使用しているため。
補正(これはに答えるだと思います)についてのブーストシリアルます:
これはデータのバージョン管理をサポートすることができません>。
あなたが圧縮が必要な場合 - 圧縮されたストリームを使用
。エンコーディングはバイナリ、テキスト、またはXMLことができるようなプラットフォーム間のエンディアンスワップを扱うことができます。
私はブーストのライブラリを使って何かを実装することはありませんが、私は、Googleのprotobuffのより考え抜かれたことが判明し、そしてコードが読みずっとクリーンで簡単です。私はあなたがそれを使用してコードとドキュメントを読んを持っているし、あなたの心を作りたいさまざまな言語を見てみたお勧めします。
私はprotobufsとしていた1つの難易度は、彼らは、Win32のGetMessageマクロとその当然の紛争、)その生成されたコードのGetMessage(では非常に一般的に使用される機能を名付けました。
私はまだ非常にprotobufsをお勧めします。彼らは非常に便利です。
工学のほとんどすべてと同じように、私の答えは...「それが依存しています。」
の両方が良く、吟味の技術をテストしています。どちらも、あなたのデータを取り、どこかを送信するためのフレンドリーなものに変えます。どちらも、おそらく十分に速くなり、そしてあなたが本当にここまたはそこにバイトをカウントしている場合、あなたはおそらくどちらか(両方作成したパケットは、XMLやJSONのごく一部になりますそれに直面しよう)と幸せになるつもりはありません。
私にとって、それは本当にワークフローとあなたはもう一方の端にC ++以外の何かが必要かどうかをするためにダウンしています。
あなたが最初にあなたのメッセージの内容を把握したいとあなたがゼロからシステムを構築している場合は、、プロトコルバッファを使用します。あなたは抽象的な方法でメッセージを考えると、あなたは(サードパーティのプラグインがちょうど約すべてのための利用可能です)好きな言語でコードを自動生成することができます。また、私はプロトコルバッファを簡素化コラボレーションを見つけます。私は.protoファイルを介して送信し、他のチームは、データが転送されているものの明確な考えを持っています。また、私は彼らに何かを課すことはありません。彼らは、Javaを使用したい場合は、先に行く!
私はすでにC ++でクラスを構築している(これは少なからず起こっている)と私は今、ワイヤ上でそのデータを送信したい場合は、シリアル化を後押し明らかに意味のトンを作る(私はすでにブーストを持っている特にどこどこか別の場所に依存)。
あなたはあなたの「本当の」ドメインオブジェクトとの緊密な連携して、ブーストのシリアル化を使用し、完全なオブジェクト階層(継承)をシリアライズすることができます。あなたが集約を使用する必要がありますので、いるProtobufは、継承をサポートしていません。人々がいるProtobufはのDTO(データ転送オブジェクト)のために使用され、そしてないコアドメインのためのオブジェクト自体をしなければならないと主張しています。私はブースト::シリアル化といるProtobufの両方を使用しています。ブースト::シリアル化のパフォーマンスは、考慮に代わるかもしれませんの穀物を取られるべきです。
知っていることにあるこの問題のもうと思って投げる私の2ペンス!
力する機会を私は書き込むデータ検証クラス;これは良いデータで定義の妥当性をチェックしています。
と凝のできるだけコメントした。プロトファイルを希望する希望する人には誰でも読み込みで注目したので、実施の妥当性をチェック。
言うまでもなくこのは、信頼できない場合に依拠したことにほかの誰かのネットワークストリームに同じ元気とすることになります。ロマンティックの制約が有効に変更、複数のコードの変更が必要な計画、協調行われます。
このように私の考えでは凝が不適切と判断する行為のために動きの少ない機会を定期的にお話しすべてのチームは以下の記号で表示した。
==EDIT==
のようなことがいえるでしょう意味です:
message Foo
{
int32 bearing = 1;
}
今は誰が何と言っても、有効な範囲の bearing
す。していきたいで
message Foo
{
int32 bearing = 1; // Valid between 0 and 359
}
ものに依存する他の誰かが読み書きコードです。例えば、編集での制約につなが
message Foo
{
int32 bearing = 1; // Valid between -180 and +180
}
だ完全に依存皆様に使用しています。proto更新します。ることは信頼できない。
少なくとも力serialisationだ配布、シングルC++クラスができるデータの妥当性をチェックされていれます。る場合これらの制約の変更、そして誰が必要な作業以外のいいを同じバージョンのソースコードとしています。
代替
が代替:ASN.1.これは古いが本当に、本当は、手軽なもの:
Foo ::= SEQUENCE
{
bearing INTEGER (0..359)
}
注意に与えます。いきものが消費します。asnファイルを生成コードも終わると自動的にチェック bearing
はこれらの中間に位置付けられ0 359.場合は更新できます。asnファイル
Foo ::= SEQUENCE
{
bearing INTEGER (-180..180)
}
それら全てが必要なのは、再コンパイル.他にはないコードの変更が必要です。
もできます:
bearingMin INTEGER ::= 0
bearingMax INTEGER ::= 360
Foo ::= SEQUENCE
{
bearing INTEGER (bearingMin..<bearingMax)
}
注意 <
.また多くのツールのbearingMinとbearingMaxれを定数として、生成されます。それに極めて有効である。
制約す可能性があることが凝:
Garr ::= INTEGER (0..10 | 25..32)
見第13章ではこの PDF;で何ができるか;
配列が制約されています:
Bar ::= SEQUENCE (SIZE(1..5)) OF Foo
Sna ::= SEQUENCE (SIZE(5)) OF Foo
Fee ::= SEQUENCE
{
boo SEQUENCE (SIZE(1..<6)) OF INTEGER (-180<..<180)
}
ASN.1は昔ながらも積極的に展開し、広く利用されている(携帯電話の使用も多く、より柔軟性のserialisation技術です。のみが欠損するまでにはありませんのワコードジェネレータエラーになります。使用している場合は、C/C++、C#、Java、ADAは、それ以外にも混合物の無料(C/C++、ADA)-商業C/C++、C#、JAVA)ツールです。
私は特に幅広い選択肢のバイナリおよびテキストベースwireformats.ここで非常に便利である。のwireformatリストの現在の内容:
- 光ファイバー(バイナリ)
- (バイナリー、およびunaligned.この超ビットの効率的です。例えば、整数制約されると
0
や15
されるとのことだけ4 bits
のワイヤー) - OER
- DER(別のバイナリ)
- XML(XER)
- JSON(ブランドの新しいツール支援がまだまだ発展途上の段階にあり)
プラスです。
注前かったですね。あり、またデータ構造のASN.1をコード、および光/消費するメッセージはXMLやJSON.悪くないための技術開始したのが1980年代
バージョン管理を行っ凝.できる拡張:
Foo ::= SEQUENCE
{
bearing INTEGER (-180..180),
...
}
これは後日追加できる Foo
, に、古いシステムがこのバージョンでも作業ができるだけアクセス bearing
ます。
I率のASN.1非常に高い.できる痛みに対処ツールもお金、生成したコードはありませんが美しいです。その制約については、真の幻想的な特徴として保存された全体トンの中心が痛いです。する開発者whinge多くの場合、エンコーダ/デコーダの報告書におい発生するダデータです。
その他リンク:
観測
データをシェア:
- コードの最初のアプローチなどブserialisation)を制限する独自の言語(例えばC++)や、まだ多くの作業を他の言語
- スキーマでは、より良いもの
- 多くのこれらの休業大きなギャップの共有契約(無制限).凝は思この点では非常に良いです。
- あるいは制約などXSD、JSON)もが海洋についツールです。
- 例えば、マイクロソフトのxsd.exe 積極的に制約を無視し、xsdファイル(MSの言い訳が弱).XSD良し(制約からの視点ができない場合には信託のその他のガイを用いXSDツールを実施したそのXSDは縮小し
- JSON validatorはokでなく、JSONのでないのと、自動的に呼び出されます。ありません保証人がお送りしますJSONのメッセージに対してなコストダウンが期待できvalidator.ごうひとつ忘れてはいけないのを検証します。
- ASN.1ツールな実施のための制約をチェックしている。
いいんじゃないかとASN.1なのです。するものは少なくともれうものではの特徴のツールをすべて見る努力を完全に実施され、言語の中で十分です。
素直になれば、凝追加制限機構におけばいいですかの発表をすることがあります。XSD圏のツールがほぼ普遍的にごみまたワコードジェネレータその他の言語を、JSONスキーマが良いと思います。
場合に凝った制約を追加します(注:このような変化をワイヤーフォーマット、その思いはされています。皆様に用いることにより、ほぼすべての目的です。ものASN.1uPERに非常に有用である。無線リンクになります。