Могу ли я установить максимальное значение числа в protobuf?

В protobuf у нас есть только выбор использования 32- или 64-битного целого числа со знаком или без знака, чтобы ограничить диапазон значения.

Однако структура данных, которую я хочу определить, содержит смесь 8-битных, 16-битных и 32-битных целых чисел для экономии места на встроенных устройствах. На них структура данных также реализована несколько иначе и требует зарезервированных специальных значений для некоторых полей, поэтому максимальное число для них не является степенью двойки.

На этих встроенных устройствах определение protobuf используется только для передачи к ним и от них, а не для фактического хранения. Так что я мог бы просто ограничить числа при их чтении.

Однако я бы предпочел определить эти максимальные значения в файле .proto или .options, чтобы убедиться, что все клиентские приложения знают об этих ограничениях.

Есть ли способ сделать это?

Я знаю, что есть параметры поля, но перечисленные здесь не содержит такой опции. Можно создавать пользовательские параметры, но для этого, похоже, потребуется написать расширение компилятора, а это значит, что мне придется вручную реализовать эту проверку ограничений для каждого языка, на который я хочу скомпилировать, а это стоит больше времени, чем когда-либо сэкономит.


person iFreilicht    schedule 03.12.2017    source источник


Ответы (2)


Это невозможно в protobuf по умолчанию, и спецификация не включает синтаксис для принудительного применения подобных ограничений.

Однако некоторые сторонние реализации включают такую ​​поддержку.

Например, мой собственный nanopb имеет параметр int_size. :

int_size: переопределяет целочисленный тип поля. (Чтобы использовать, например, uint8_t для экономии оперативной памяти.)

Это вернет ошибку во время выполнения из pb_decode(), если значение не помещается в поле.

person jpa    schedule 04.12.2017
comment
Это очень полезно знать, я на самом деле использую nanopb на Arduino! К сожалению, это не идеально, поскольку сообщения также отправляются между приложениями, которые не взаимодействуют с Arduino напрямую, поэтому они не будут знать об этих ограничениях. - person iFreilicht; 05.12.2017

Нет синтаксиса для выражения этого намерения и нет встроенного инструмента/codegen, который будет обеспечивать соблюдение правила, которое вы хотите добавить. Вам нужно будет справиться с этим вручную.

person Marc Gravell    schedule 03.12.2017