Повторное Int32Value в protobuf3 (обнуляемый массив int) - PullRequest
0 голосов
/ 09 июня 2018

У меня есть следующий протокол сообщений protobuf:

message TestMsg
{
  int32 int = 1;
  google.protobuf.Int32Value nullable_int = 2;
  repeated google.protobuf.Int32Value nullable_int_array = 3; // Runtime fail
}

protoc прекрасно его компилирует, а в C # все Int32Values ​​имеют тип int ?.Но он не работает во время выполнения с нулевым аргументом, не допускающим исключенияЯ могу понять, repeated не позволяет пустые сообщения.Но Int32Value является WellKnownType, поэтому компилятор может генерировать специальный тип NullValue, если это необходимо.

Это ограничение в protobuf (не допускается Int32Value в repeated) или это ограничение / ошибка вгенерация кода C # и вспомогательные библиотеки?

Какие есть варианты делать обнуляемые массивы int в протоколе protobuf, кроме создания вашего собственного сообщения и codegen?

1 Ответ

0 голосов
/ 09 июня 2018

Это ограничение в protobuf

Да.Повторное Int32Value работает так же, как и другие повторяющиеся сообщения: нет способа представить нольОбратите внимание, что на проводе нет специальной обработки для Int32Value, и многие языки вообще не имеют никакой специальной специальной обработки для нее.И да, это означает, что поле repeated Int32Value довольно бессмысленно.Это общий оператор, а не что-либо специфичное для C #.

Если вы хотите иметь возможность представлять повторяющееся поле с некоторыми пустыми записями, вам нужно создать сообщение, заключающее в себеобертка:

message Int32ValueWrapper
{
    Int32Value value = 1;
}

... тогда есть поле repeated Int32ValueWrapper.Это будет заполнено элементами Int32ValueWrapper, все из которых будут ненулевыми, но некоторые из них могут быть пустыми (поэтому поле value не заполнено).

Это сложная ситуация для генерации кода C #с точки зрения того, что он должен делать ... это, по сути, небольшое несоответствие импеданса.

...