問題タブ [protocol-buffers]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - protobuf-net を使用した C# プロジェクトのプロトコル バッファー - コード生成のベスト プラクティス
protobuf-net を使用して、C# プロジェクトで protobuf を使用しようとしていますが、これを Visual Studio プロジェクト構造に編成する最良の方法は何か疑問に思っています。
protogen ツールを手動で使用してコードを C# に生成する場合、人生は簡単に思えますが、正しくないと感じます。
.proto ファイルを主要なソース コード ファイルと見なし、C# コンパイラが関与する前に副産物として C# ファイルを生成したいと考えています。
オプションは次のようです。
- プロト ツール用のカスタム ツール (ただし、どこから始めればよいかわかりません)
- ビルド前のステップ (protogen またはそれを実行するバッチ ファイルの呼び出し)
絶対パスを使用しない限り、「システムは指定されたファイルを見つけることができません」と表示されるため、上記の2)に苦労しました(また、プロジェクトを明示的に配置することを強制したくありません)。
これには(まだ)慣習がありますか?
編集: @jon のコメントに基づいて、ビルド前のステップ メソッドを再試行し、Google のアドレス帳の例を使用して、これを使用しました (プロトジェンの場所は今のところハードコードされています)。
Edit2: .proto ファイルが変更されていない場合は処理しないことでビルド時間を最小限に抑えるという @jon の推奨事項を取り入れて、チェックするための基本的なツールをまとめました (これはおそらく完全なカスタム ビルド ツールに拡張できます)。 ):
私のビルド前のコマンドは次のとおりです(すべて1行で):
protocol-buffers - クロスランゲージ オーバー ザ ワイヤ バイナリ フォーマットとして、Google Protocol Buffers または Caucho Hessian をお勧めしますか?
クロスランゲージ オーバー ザ ワイヤ バイナリ フォーマットとして、Google Protocol Buffers または Caucho Hessian をお勧めしますか? または、それ以外の何か - たとえば、Facebook Thrift?
c# - Protocol Buffer はどのくらい高速または軽量ですか?
Protocol Buffer for .NET は Remoting (SerializationFormat.Binary) より軽量/高速になりますか? 言語/フレームワークの観点から、それに対するファーストクラスのサポートはありますか? つまり、Remoting/WebServices のように透過的に処理されますか?
python - memcached のオブジェクトに最適なシリアル化方法は何ですか?
私の Python アプリケーションは現在、python-memcached APIを使用して memcached 内のオブジェクトを設定および取得しています。この API は、Python のネイティブpickle モジュールを使用して、Python オブジェクトをシリアライズおよびデシリアライズします。
この API を使用すると、ネストされた Python リスト、辞書、およびタプルを memcached に簡単かつ迅速に格納できます。これらのオブジェクトをアプリケーションに読み込むことは完全に透過的であり、機能します。
しかし、私は Python だけを使用することに限定したくありません。また、すべての memcached オブジェクトが pickle でシリアル化されている場合、他の言語で記述されたクライアントは機能しません。
私が検討したクロスプラットフォームのシリアル化オプションは次のとおりです。
- XML - 主な利点は人間が判読できることですが、このアプリケーションではそれは重要ではありません。XML も多くのスペースを必要とし、解析にはコストがかかります。
- JSON - 優れたクロスプラットフォームの標準のように思えますが、memcached から読み戻されたときにオブジェクト タイプの特性が維持されるかどうかはわかりません。たとえば、この投稿によると、タプルはsimplejsonを使用するとリストに変換されます。また、JSON 構造に要素を追加すると、古い構造に記述されたコードが壊れる可能性があるようです
- Google Protocol Buffers - 非常に高速でコンパクトに見えるため、これに非常に興味があります。少なくとも XML よりも 10 倍小さく高速です。人間が読める形式ではありませんが、このアプリにとっては重要ではありません。古いコードを壊さずに構造の成長をサポートするように設計されているようです
このアプリの優先順位を考えると、memcached の理想的なオブジェクトのシリアル化方法は何ですか?
- クロスプラットフォームのサポート (Python、Java、C#、C++、Ruby、Perl)
- ネストされたデータ構造の処理
- 高速シリアライゼーション/デシリアライゼーション
- 最小メモリフットプリント
- 古いコードを壊さずに構造を変更できる柔軟性
c# - プロトコルバッファメッセージが完全に受信されたことを検出するにはどうすればよいですか?
これは、私の他の質問からの分岐のようなものです。よろしければお読みくださいが、必須ではありません。
基本的に、大きなメッセージでC#のBeginReceive()を効果的に使用するには、(a)最初にパケット長を読み取り、次にそのバイト数を正確に読み取るか、(b)パケットの終わりの区切り文字を使用する必要があることに気付きました。私の質問は、これらのいずれかがプロトコルバッファに存在するかどうかです。まだ使用していませんが、ドキュメントを見ると、長さのヘッダーや区切り文字がないようです。
そうでない場合は、どうすればよいですか?メッセージを作成してから、長さヘッダー/ EOP区切り文字でプレフィックス/サフィックスを付ける必要がありますか?
performance - GoogleProtocolBuffersとASN.1の比較
Google Protocol BuffersとASN.1(PERエンコーディングを使用)の最も顕著な違いは何ですか?私のプロジェクトにとって最も重要な問題は、シリアル化されたデータのサイズです。誰かが2つの間のデータサイズの比較をしましたか?
java - ハイパフォーマンスシリアライゼーション: Java vs Google Protocol Buffers vs ...?
今後のプロジェクトで実行することを考えているキャッシングについては、Java シリアライゼーションについて考えてきました。つまり、使用する必要がありますか?
ここ数年、さまざまな理由からカスタムのシリアライゼーションとデシリアライゼーション (Externalizable) を書いてきました。最近では、相互運用性がさらに問題になってきており、.Net アプリケーションと対話する必要性が予見できるので、プラットフォームに依存しないソリューションを使用することを考えました。
GPB を高性能に使用した経験のある人はいますか? 速度と効率の点で、Java のネイティブ シリアライゼーションと比べてどうですか? あるいは、検討する価値のある他のスキームはありますか?
c# - protobuf-net で未知の型をデシリアライズする
シリアル化された protobuf-net メッセージを相互に送信する必要がある 2 つのネットワーク アプリがあります。オブジェクトをシリアル化して送信できますが、受信したバイトを逆シリアル化する方法がわかりません。
これでデシリアライズしようとしましたが、NullReferenceException で失敗しました。
メッセージ タイプ ID を含むシリアル化されたバイトの前にヘッダーを渡しています。これを巨大な switch ステートメントで使用して、予想される sublcas Type を返すことができます。以下のブロックでは、次のエラーが表示されます: System.Reflection.TargetInvocationException ---> System.NullReferenceException.
ネットワーク経由でメッセージを送信するために使用する関数は次のとおりです。
このクラスは、基本クラスで、シリアル化しています:
Marc Gravell の提案を使用して修正しました。読み取り専用プロパティから ProtoMember 属性を削除しました。また、SerializeWithLengthPrefix を使用するように切り替えました。これが私が今持っているものです:
オブジェクトを受け取るには:
オブジェクトを送信するには:
c++ - C++ シリアライゼーションのパフォーマンス
std コンテナーに格納されているデータのシリアル化と逆シリアル化を多数行う必要がある分散 C++ アプリケーションを構築しています。
現在、Boost.serialization が採用されています。しかし、それはひどい性能です。弊社の B-tree も Boost.serialization を使用してキーと値のペア データを格納しますが、Boost.serialzation を memcpy に変更すると、アクセス速度が 10 倍以上向上します。現在の分散プラットフォームでは、非常に多くのデータ交換が必要になるため、簡単なプログラミングも高いパフォーマンスと共に求められます。プロトコル バッファもシリアライゼーション メカニズムとして使用できることは知っていますが、Boost.serialization とプロトコル バッファのパフォーマンス比較についてはよくわかりません。別の問題は、memcpy に近いパフォーマンスを提供するためのより良いソリューションが存在するかどうかです。
ありがとう