Protobuf-net Protogen为int32生成DataFormat.TwosComplement

时间:2012-09-09 10:07:53

标签: protobuf-net protogen

我正在使用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类型。这是预期的行为吗?

1 个答案:

答案 0 :(得分:4)

这是与“核心”protobuf文档相匹配的行为。来自"More Value Types"部分:

  

签名整数

     

正如您在上一节中看到的,与线类型0关联的所有协议缓冲区类型都被编码为varints。但是,在编码负数时,signed int类型(sint32和sint64)与“standard”int类型(int32和int64)之间存在重要差异。如果使用int32或int64作为负数的类型,则生成的varint总是十个字节长 - 实际上,它被视为一个非常大的无符号整数。如果使用其中一种签名类型,则生成的varint使用ZigZag编码,效率更高。

“默认varint类型”是效率低下的有线值格式,可能是负值。

根据文档,使用sint32来使用ZigZag编码。

基本上,我认为protobuf-net表现得非常正确。