問題タブ [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.
generics - protobuf-net は、このインターフェイスとジェネリック コレクションの組み合わせをシリアル化できますか?
をシリアル化しようとしていますがItemTransaction
、protobuf-net (r282) に問題があります。
ItemCollection は次のようになります。
ここで、T は Item の派生型です。ItemCollection には、IItemCollection 型のプロパティもあります。
私はこのようにシリアライズしています:
私の最終的な目標は、ItemTransaction をシリアル化することですが、IItemCollection に引っかかっています。
アイテムとその派生型は問題なく [逆] シリアル化できます。[1] を参照してください。ただし、IItemCollection の逆シリアル化は失敗します (シリアル化は機能します)。ItemCollection には ItemExpression プロパティがあり、逆シリアル化する場合、protobuf は抽象クラスを作成できません。これは私には理にかなっていますが、どうすればそれを乗り越えられるかわかりません。
ItemExpression は Expression と同様に抽象的です
これを正しく機能させるにはどうすればよいですか?
また、コンパイル時に IItemCollections が異なり、不明になるため、ItemTransaction が失敗するのではないかと心配しています (ItemTransaction には FooCollection、BarCollection、FlimCollection、FlamCollection などがあります)。
何が足りないのですか (Marc) ?
c# - Protobuf-netで、潜在的な型のセットを事前に知って、内部にさまざまな型のオブジェクトを含む型オブジェクトの配列を渡すにはどうすればよいですか?
XmlSerializerを使用する既存のコードをprotobuf-netに移行しようとしていますが、パフォーマンスが向上しているため、この特定のケースで問題が発生しています。
リモートホスト(カスタムミニRPC機能の一種)に送信されるパラメーターを含むobject[]があります。これらのパラメータを使用できるタイプのセットは知っていますが、どの順序で送信されるかを事前に知ることはできません。3つの制約があります。1つ目は、Compact Frameworkで実行しているため、そこで機能するものが必要です。第二に、私が述べたように、パフォーマンスは(シリアル化側で)大きな懸念事項であるため、可能であれば、そこで多くのリフレクションを使用することは避けたいと思います。そして最も重要なのは、このパラメーターが送信された順序を気にすることです。XmlSerializerを使用すると、XmlIncludeを追加するだけで簡単でしたが、Protobuf-netで私が知る限り、フィールドに相当するものはありません。それで、これを行う方法はありますか?これは簡単な例です。
これはXmlSerializerで機能しますが、protobuf-netに変換しようとすると、「オブジェクトのデフォルトのエンコーディングがありません」というメッセージが表示されます。
私が思いついた最善の方法は、この例に示すように、ジェネリックスと[ProtoInclude]を使用することです。配列内にさまざまなオブジェクトタイプを含めることができるので、これではうまくいきません。潜在的なタイプごとにジェネリックリストを追加し、[ProtoIgnore]とタイプobject []のプロパティを追加して、それらを追加して取得しました。それらを追加するときにリフレクションを使用する必要があります(各アイテムを配置する配列を知るため)。これは望ましくありませんが、各リストのすべてのアイテムを1つずつ抽出して、プロパティgetの新しいobject[]配列。
これを達成する方法があるのだろうか?
マークが以下に提案したことを試しましたが、うまくいきませんでした。何か誤解したのではないかと思います。
作成したコードを使用します。MessageParam Createを使用して、リストに追加するMessageParamオブジェクトを生成する必要があると思いました。したがって、基本的に、次のようにメッセージにコンストラクタを追加しました。
しかし、そうすると、シリアライザーが非ジェネリックバージョンを予期していると想定しているため、「シリアル化中に予期しないタイプが見つかりました。タイプはProtoIncludeAttributeに含まれている必要があります。MessageParam`1がMessageParamとして渡されました」というメッセージが表示されます。私はあなたの提案を誤解しましたか?もしそうなら、何をするのが正しいですか?
c# - Compact Framework でのプロトコル バッファーの逆シリアル化と動的に読み込まれる DLL
ここで完全なフレームワークに関するこれに関連する質問を見ました。かなり長い間未解決のままだったようで、これはコンパクトなフレームワーク用であるため、新しい質問を作成した方がよいと思いました。
アセンブリを動的に (Assembly.LoadFrom を使用して) ロードしている型を逆シリアル化したいのですが、「ProtoIncludeAttribute の既知の型を識別できません」というエラーが発生します。
私が言及した関連する質問では、 AppDomain.AssemblyResolve イベントをフックすると問題の解決に役立つことが示唆されました。完全なフレームワークには意味がありますが、そのイベントは CF では使用できません。CFでこれを行う方法があるのだろうか。
私が使用している構造はこれによく似ており、逆シリアル化に必要なすべてのクラスは同じアセンブリから読み込まれます。アセンブリが動的に読み込まれるのではなく参照されている場合は正常に動作しますが、動的に読み込まれると失敗します。
protobuf-net - protobuf-net の使用時に空の文字列に逆シリアル化された null 文字列
メッセージのシリアル化と逆シリアル化に protobuf-net を使用しています。私のメッセージには、null になる可能性のある来る文字列も含まれています。ただし、反対側でそれらを逆シリアル化すると、空の文字列 ("") が得られます。
Google ドキュメントによると、文字列型のデフォルト値は空の文字列です。この問題の解決策は何ですか?
私が使用しているコードは次のとおりです。
同じストリームを逆シリアル化すると、s_value = ""
protobuf-net - protobuf の Java 実装の parseFrom を呼び出すと、プログラムがハングする
メッセージがあります (OuterMessage と呼びます)
そして内なるメッセージ
OuterMessage で parseFrom を呼び出すとOuterMessage.parseFrom(buffer)
、メソッドは返されず、例外もスローされません。しかし、InnerMessage.parseFrom(buffer)
そうすると、空の InnerMessage インスタンスが返されます。
protobuf-net を使用してメッセージをシリアル化しています。問題の原因は何ですか?
更新: デバッガー コンソールを確認したところ、次の例外がスローされました。
JavaとC#の両方で同じ.protoファイルをチェックしました。このメッセージKeyValuePackageResponseProtocol
は、正常に初期化されているように見える他の多くのメッセージでも使用されています。この問題を解決するために確認する必要がある特定のことはありますか?
.net - RESTful .NET と protobuf-net
WCF RESTful スターター キットまたは OpenRasta を使用して作成された RESTful Web サービスで protobuf-net を使用することはできますか? 可能であれば、利用可能な例またはコード スニペットはありますか? Java クライアントによって消費される .NET Web サービスを作成しています。
c# - protobuf-net の必須でないフィールドのシリアル化
ProtoBuf シリアル化されたメッセージを介して、Google と通信している動作中の Java クライアントがあります。現在、そのクライアントを C# に変換しようとしています。
パラメータがオプションの文字列である.proto
ファイルがあります。appId
protobuf-net ライブラリによって生成される C# 表現のデフォルト値は、同じファイルの Java 表現と同様に空の文字列です。
Java クライアントで明示的に設定appId
すると、クライアントが動作を停止することがわかりました (403 Bad Request from Google)。Javaクライアントで""
明示的に設定appId
すると、すべてが機能しますが、それは false に設定されているためです(それがシリアライゼーションにどのように影響するかはわかりません)。null
hasAppId
C# クライアントでは、常に 403 応答が返されます。値を設定しないこととデフォルト値を設定することの違いの背後にあるロジックはわかりません。これは、Java クライアントにすべての違いをもたらすようです。出力は常にバイナリ ストリームであるため、成功した Java メッセージが空の文字列でシリアル化されているのか、まったくシリアル化されていないのかはわかりません。
C# クライアントではIsRequired
、属性を true に設定しProtoMember
て強制的にシリアル化しようとしました。また、デフォルト値を null に設定して明示的に設定しようとしたので、いくつかの構成""
を試したと確信しています。値がシリアル化されている場所。また、ある時点でパラメーターを完全に削除して遊んでみましたが、C# で 403 エラーを回避できませんでした。ProtoBuf.ProtoIgnore
appId
シリアル化された文字列を Java から手動でコピーしようとしたところ、問題が解決したので、HTTP 要求の残りの部分が機能していることは確かであり、エラーはシリアル化されたオブジェクトまでたどることができます。
私のシリアライゼーションは単にこれです:
何が何をするのかよくわからないことは認めますDeepClone
。あり・なし両方試してみましたが…
c# - Google プロトコル バッファ - 固定サイズのバッファ?
Google プロトコル バッファを使用して、エンコードするすべてのメッセージの最大サイズを設定できますか?
エンコードするデータが X バイトを超えることがないことがわかっている場合、Google Protobuffs は常にサイズ Y のバッファを生成し、データ量が少ない場合はサイズ Y にパディングしますか?
c# - protobuf-netを使用して.protoファイルを処理する方法
私はprotobuf-netlibを使用して、維持しているいくつかのプログラム間の通信を開始しました。また、C#からRubyへのメッセージをデコードすることもできました。私のrubyProtoBuflibは、.protoファイルを使用してrubyコードを生成しています。できるだけ少ない場所で変更を加える必要があるため、protobuf-netに同じ.protoファイルを使用させたいと思います。protobuf-netフォルダーを見ると、ProtoBufGeneratorという名前のDLLとprotobuf exeがありますが、protobuf-netをこのように機能させることができるかどうかについての指示が見つかりません。
これは可能ですか?
c# - Protobuf-net のチュートリアルはありますか?
私はprotobuf-netについて読んでいますが、それは素晴らしいです!
使用できるチュートリアルはありますか? (より具体的にはDictionary<TKey,TValue>
、ジェネリック医薬品の契約)
それに関連するヒントはありますか?
現在のコードベースに単純にプラグインできますか、それとも何か変更が必要ですか?