問題タブ [protobuf-net]
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行で):
c# - プロトコル バッファーの逆シリアル化と動的に読み込まれる DLL
プロトコルのバッファリングに protobuf-net を使用しています。動的にロードしているdllがあります。dll に含まれるデータ クラスのインスタンスを作成し、作成したデータ オブジェクトを使用および変更できます。ただし、データ オブジェクトをシリアライズ/デシリアライズしようとすると、次のクラッシュが発生します。
{"ProtoIncludeAttribute の既知の型を識別できません: MyDataDLL.MyDataClass、MyDataDLL、Version=0.0.0.0、Culture=neutral、PublicKeyToken=null"}
また、MyDataClass が MyBaseClass のサブクラスではないなどのクラッシュが発生することもあります。MyDataClass は確実に MyBaseClass を継承し、 MyBaseClass には MyDataClass の ProtoInclude タグがあります。
クラッシュは「method.invoke」で発生します
プロジェクトで dll を参照してそのように使用すると、クラッシュは発生しません。だから私はそれが動作しているdllであることを知っています。
更新: はい、MyDataClass と MyBaseClass は同じアセンブリにあります。
以下は、私のコードがあなたのテスト クラスと異なる動作をするリストです。おそらく広範囲ではありません: MyDataClass は、7 つの ProtoIncludes のリストの 4 番目です。
MyBaseClass にはすべてのデータ フィールドが含まれ、MyDataClass にはこれらのデータ フィールドを操作する関数のロジックが含まれます。したがって、MyDataClass には ProtoMember 呼び出しはありません。
MyBaseClass は IExtensible インターフェイスを実装し、追加データを処理する次の関数を備えています。
おそらく何の影響もありませんが、私の ProtoContracts は Name パラメータを使用します。
c# - protobuf-net で未知の型をデシリアライズする
シリアル化された protobuf-net メッセージを相互に送信する必要がある 2 つのネットワーク アプリがあります。オブジェクトをシリアル化して送信できますが、受信したバイトを逆シリアル化する方法がわかりません。
これでデシリアライズしようとしましたが、NullReferenceException で失敗しました。
メッセージ タイプ ID を含むシリアル化されたバイトの前にヘッダーを渡しています。これを巨大な switch ステートメントで使用して、予想される sublcas Type を返すことができます。以下のブロックでは、次のエラーが表示されます: System.Reflection.TargetInvocationException ---> System.NullReferenceException.
ネットワーク経由でメッセージを送信するために使用する関数は次のとおりです。
このクラスは、基本クラスで、シリアル化しています:
Marc Gravell の提案を使用して修正しました。読み取り専用プロパティから ProtoMember 属性を削除しました。また、SerializeWithLengthPrefix を使用するように切り替えました。これが私が今持っているものです:
オブジェクトを受け取るには:
オブジェクトを送信するには:
c# - 難読化と protobuf.net - 例外: デフォルトの列挙値が定義されていません
難読化されたプロジェクトで列挙型を含むクラスをシリアル化しようとすると、次の例外が表示されます。
ProtoBuf.ProtoException: デフォルトの列挙値 X は、オプションのプロパティ Y に対して定義されていません
影響を受けるすべての列挙型を難読化から除外すると、すべて正常に動作しますが、より多くのコード コンテンツを難読化できるように protobuf.net に切り替えたので、より良い解決策があることを願っています。
それで、protobuf.netをめちゃくちゃにするのは難読化ツールですか、それとも列挙型を間違った方法で宣言していますか?
私が試してみました:
と
また、契約がまったくなく、他のいくつかのそれほど明白ではないこともありますが、除外が機能すること以外は何もありません。ところで: protobuf.net を使用するときに列挙型を使用する必要がある例はどこかにありますか?
c# - ProtoInclude 属性の意味 (protobuf-net 内)
ProtoBuf-Net実装では、ProtoInclude属性は何を意味し、何をしますか?
例をいただければ幸いです。
この投稿でそれを見ましたが、それが何をするのかわかりません。例は次のとおりです。
また、protogenツールを使用してそのような継承を生成する方法はありますか?
c# - シリアライゼーション/デシリアライゼーションの XML とバイナリのパフォーマンス
コンパクトなフレームワーク アプリケーションに取り組んでおり、パフォーマンスを向上させる必要があります。アプリは現在、オブジェクトを XML にシリアル化し、データベースに保存することでオフラインで動作します。プロファイリング ツールを使用すると、これがかなり大きなオーバーヘッドであり、アプリの速度が低下することがわかりました。バイナリシリアライゼーションに切り替えるとパフォーマンスが上がると思ったのですが、コンパクトなフレームワークではサポートされていないため、protobuf-net を調べました。シリアル化は高速に見えますが、逆シリアル化ははるかに遅く、アプリはシリアル化よりも多くの逆シリアル化を行っています。
バイナリのシリアル化を高速化する必要がありますか?そうであれば、パフォーマンスを高速化するために何ができますか? XML とバイナリの両方を使用する方法のスニペットを次に示します。
XML シリアル化:
Protobuf-net バイナリ シリアル化:
.net - Protobuf-net NET CF クライアントで WCF サービスを利用するには?
Protobuf-net の RPC 機能を使用して WCF Web サービスを使用しようとしています。これが私のサービス契約です:
そして、そのすぐ下が私の .NET CF クライアントです。
class EchoServiceClient : ProtoClient, IEchoService {
そして、これは私がWebサービスを消費しようとする方法です:
次のメッセージで例外が発生し続けます。
AllowWriteStreamBuffering が無効な場合に書き込み操作を実行するには、ContentLength を負でない数値に設定するか、SendChunked を true に設定する必要があります。
protobuf-net のソース コードを掘り下げた後にわかる限り、問題は content-length が指定されていないことのようです。.NET CF で protobuf-net シリアル化を使用して WCF Web サービスを使用する方法や、この問題を解決する方法はありますか?
あなたがいるマーク:)
protobuf-net - ProtoInclude は不要な依存関係を追加します
分散キャッシュ アプリケーションで .NET シリアル化をプロトコル バッファーに置き換えたところ、その結果は非常に印象的でした。私が気に入らない唯一のことは、基本メッセージ クラスとその子の間に依存関係を追加する必要があり、循環依存関係が作成されるという事実です。基本クラスに ProtoInclude でタグ付けする代わりの方法はありますか?
c# - 頑固なオブジェクトは protobuf-net でシリアル化されません
protobuf-net を WCF サービス ベースのソリューションに統合していますが、理解できない障害に遭遇しました。次のクラスは、ObjectId プロパティを除いてすべて正常にシリアル化されます。
これが私をいじっているクラスです:
運が悪いので、複数のことを試しました。どんな考えでも大歓迎です!