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 ведет себя абсолютно корректно.