我正在使用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类型。这是预期的行为吗?
答案 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表现得非常正确。