1

protobuf-net r580に含まれているProtogenを使用して、次の.protoファイルをコンパイルしています。

message TestMessage2 {
  required int32 someint = 1; 
}

そして、私は奇妙な結果のコードがTwosComplementワイヤーフォーマットを使用していることに気づきました:

Private _someint As Integer
<Global.ProtoBuf.ProtoMember(1, IsRequired:=True, Name:="someint", DataFormat:=Global.ProtoBuf.DataFormat.TwosComplement)> _
Public Property someint As Integer

より最適化されたデフォルトのvarintタイプの代わりに。これは意図された動作ですか?

4

1 に答える 1

4

これは、「コア」protobufドキュメントと一致する動作です。「その他の値型」セクションから:

符号付き整数

前のセクションで見たように、ワイヤタイプ0に関連付けられているすべてのプロトコルバッファタイプは、varintとしてエンコードされます。ただし、負の数のエンコードに関しては、符号付きint型(sint32およびsint64)と「標準」int型(int32およびint64)の間に重要な違いがあります。負の数の型としてint32またはint64を使用する場合、結果のvarintは常に10バイト長になります。これは、事実上、非常に大きな符号なし整数のように扱われます。符号付きタイプの1つを使用する場合、結果のvarintはZigZagエンコーディングを使用します。これははるかに効率的です。

「デフォルトのvarintタイプ」は、負の値になる可能性のある非効率的なワイヤ形式です。

ドキュメントに従って、sint32ZigZagエンコーディングを使用するために使用します。

基本的に、protobuf-netは完全に正しく動作しているように見えます。

于 2012-09-09T10:16:09.967 に答える