2011-12-22 13 views
11

このメソッドは最後の引数として整数を受け取りますが、正確に何を使用するのか分かりません。protobuf-net SerializeWithLengthPrefixタグの引数は何ですか?

Serializer.SerializeWithLengthPrefix(stream, object, PrefixStyle.Base128, [tag]); 

対応するDeserializeメソッドについても同様です。

メッセージにタグを付けて、デシリアライズで「照会」機能を追加して、不要なメッセージをフィルタにかけることができますか、他の用途がありますか?

答えて

9

基本的には、(である必要はないが)(*WithLengthPrefixアプローチを使用する場合)推定ので、追加されるメッセージの「タイプ」を注意するために使用することができるという付加的マーカーがことがあります同じストリーム内の複数のメッセージです。含めて

は、それはまた、全体複合ストリームは自体完全に有効いるProtobufメッセージであることを意味します。これを使用しての

方法:

  • あなたはList<Foo>をシリアル化して、繰り返しオブジェクトの異種のセットで(と長プレフィックス)個々のFooアイテム、またはその逆
  • をデシリアライズすることができ、 Serializer.NonGeneric APIを使用して、タグに基づいたタイプ解決を許可することができます。たとえば、if if then Invoice; 2の場合はOrder、3の場合はそれをスキップ、4の場合はCustomerなどです。メッセージ送信デバイスとしてNetworkStreamを使用している場合(タイプごとに異なるタグを使用して)このアプローチは、あなたは、ストリームから外れたオブジェクトを読み、それらを正しくデシリアライズすることができ、事前に次のメッセージ

種類を知らなくてもあなた場合は、これを省略することができますwant - ちょうどゼロを渡す(IIRC)。これは、追加されたメッセージごとのバイトを(通常は)保存しますが、ストリームがもはや有効なprotobufではないことを意味します。もちろん、読んだときにゼロを渡すことによって、それを読むことができます。

+1

なぜこのタグを含めると、有効なprotobufメッセージになりますか? タグなしでリスト内の個々のアイテムを逆シリアル化できませんか? – Simone

+0

また、タグを使用した型解決はアプリケーションコードで実行する必要があります。 – Simone

+1

@Simone「繰り返しMessageType」(.proto内)が「[tag] [length] [payload] ...のシーケンスとしてエンコードされているため、* composite *メッセージを有効なprotobufにします。[tag] [length] [ペイロード]"。したがって、タグでは有効なプロトタイプであり、そうでないタグはありません。 Re型解像度;それは意図的にプラットフォームに依存しないためです。ただし、protobuf-netには、電線に関する限られた種類の情報を含めるための追加*サポートも含まれています。 –

関連する問題