2011-07-26 12 views
1

protobuf-netを使用すると、負のintに対してジグザグのエンコードを利用できますか?negative-intのprotobuf-net処理

負の値を持つオブジェクトプロパティをシリアル化しようとすると、protobuf-netは効率的なZigzagエンコーディングの代わりにfixed32/fixed64エンコーディングに戻ります。

など。

[ProtoContract] 
internal class TestPoint 
{ 
    [ProtoMember(1)] 
    internal long Value; 
} 

var p = new TestPoint() { Value = -150 }; 

11バイトにシリアル化します。

var p = new TestPoint() { Value = 150 }; 

3バイトにシリアル化します。 ProtoWriter.csから

  case WireType.Variant: 
       if (value >= 0) 
       { 
        WriteUInt64Variant((ulong)value, writer); 
        writer.wireType = WireType.None; 
       } 
       else 
       { 
        DemandSpace(10, writer); 
        ... 

WireType.SignedVariantを使用するには、シリアル化されたクラスのメンバーを飾るために方法はありますか?ソースコードでこれを行う方法が見つかりませんでした。

それ以外の場合、protobufを負の数値に使用すると、それ以外の優れたワイヤ圧縮の目的が無効になります。

助けてください!

よろしく、 マイク

+0

http://stackoverflow.com/questions/41692470/protobuf-net-私は同じ質問があるあなたの助けが必要ですか? –

答えて

1

確かに。 protobufにはいくつかの異なるエンコーディングがあります。あなたがここに欲しいことはジグザグのエンコーディングです:いるProtobufネットでのXML-コメントがあり

[ProtoMember(1, DataFormat = DataFormat.ZigZag)] 

/// <summary> 
/// When applied to signed integer-based data (including Decimal), this 
/// indicates that zigzag variant encoding will be used. This means that values 
/// with small magnitude (regardless of sign) take a small amount 
/// of space to encode. 
/// </summary> 
ZigZag 
+0

マーク、ありがとう、これは私が必要としていたものです。ベスト、 – ionwarp