Подтвердить и переопределить значения по умолчанию на этапе синтаксического анализа

Использование собственного пакета C # версии 3.0.0-beta3 согласно официальной документации значения по умолчанию назначаются на этапе синтаксического анализа, и нет способа определить, не было ли значение вообще не передано, для моих целей это жизненно важный момент, так как я хотел сделать какую-то проверку для декодированных прото-сущностей, поэтому интересно, есть ли у кого-нибудь опыт работы с пользовательскими проверка данных или переопределение / перехват стадии синтаксического анализа каким-либо образом?

Несколько основных примеров:

  1. Для поля int32, если оно вообще не было передано, поэтому вместо значения по умолчанию 0 я хочу обработать этот случай и вызвать настраиваемое исключение
  2. Для поля int32 я хотел установить допустимый диапазон значений, например 100-1000, иначе выбросить исключение синтаксического анализа
  3. Для строкового поля я хотел установить минимальную длину на этапе синтаксического анализа / декодирования

Как бы вы предложили это сделать, кроме написания настраиваемого уровня проверки поверх пакета / API protobuf? Я все еще надеюсь, что есть точки расширяемости, но еще не нашел


person sll    schedule 24.05.2016    source источник


Ответы (1)


Проверка должна выполняться при пост-синтаксическом анализе кода приложения. В самом парсере нет никаких хуков для этого.

Proto3 не делает различий между полями со значениями по умолчанию и неотправленными полями. Фактически, на отправляющей стороне, если для поля явно задано значение по умолчанию, оно не будет закодировано. Итак, нет возможности реализовать ваше первое правило в proto3.

person Kenton Varda    schedule 24.05.2016
comment
К сожалению, это то же самое, что я нашел в документации. Понятия не имею, как системы, использующие protobuf, решают такие проблемы, кажется, определяя некоторые пользовательские значения по умолчанию, чтобы отличать их от значений по умолчанию proto3, спасибо - person sll; 25.05.2016
comment
@sll Proto3 также не поддерживает пользовательские значения по умолчанию; только ноль / пустой. Но на самом деле ответ заключается в том, что вам не нужно выполнять эту проверку. Если значение по умолчанию является приемлемым вводом, продолжайте с ним. Отправитель обязан убедиться, что он отправляет нужные значения; единственное, что вам нужно проверить на сервере, - это то, что отправленные значения не повредят серверу. - person Kenton Varda; 25.05.2016