Повторное Int32Value в protobuf3 (обнуляемый массив int)

У меня есть следующий протокол сообщения 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, кроме создания собственного сообщения и кода?

1 ответ

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

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

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

message Int32ValueWrapper
{
    Int32Value value = 1;
}

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

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

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