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 个字节长——实际上,它被视为一个非常大的无符号整数。如果您使用其中一种有符号类型,则生成的 varint 将使用 ZigZag 编码,这种编码效率更高。

“默认 varint 类型”是用于可能为负值的低效线路格式。

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

基本上,在我看来,protobuf-net 的行为绝对正确。

于 2012-09-09T10:16:09.967 回答