Protobuf-net Protogen генерирует DataFormat.TwosComplement для int32

Я использую Protogen, включенный в protobuf-net r580, чтобы скомпилировать следующий файл.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 ответ

Решение

Это поведение, которое соответствует документации "core" protobuf. Из раздела "Дополнительные типы значений":

Подписанные целые числа

Как вы видели в предыдущем разделе, все типы буферов протокола, связанные с типом провода 0, кодируются как переменные. Однако существует важное различие между типами int со знаком (sint32 и sint64) и "стандартными" типами int (int32 и int64), когда речь идет о кодировании отрицательных чисел. Если вы используете int32 или int64 в качестве типа для отрицательного числа, результирующая переменная всегда имеет длину в десять байтов - фактически она обрабатывается как очень большое целое число без знака. Если вы используете один из подписанных типов, результирующая переменная использует кодировку ZigZag, что гораздо более эффективно.

"Тип varint по умолчанию" - это неэффективный формат проводов для значений, которые могут быть отрицательными.

Согласно документам, используйте sint32 использовать кодировку ZigZag.

По сути, мне кажется, что protobuf-net ведет себя абсолютно корректно.

Другие вопросы по тегам