Как методы has_field () относятся к значениям по умолчанию в protobuf? - PullRequest
22 голосов
/ 07 февраля 2012

Я пытаюсь определить связь между значениями по умолчанию и has_foo () методами, которые объявлены в различных программных интерфейсах.В частности, я пытаюсь определить, при каких обстоятельствах (если таковые имеются) вы можете «определить разницу» между полем, явно установленным в значение по умолчанию, и неустановленным значением.

  1. Если я явно установлю для поля (например, Bar.foo) значение по умолчанию (например, ноль), то гарантируется ли Bar :: has_foo () возврат true для этих данныхсостав?(Похоже, что это верно для сгенерированного кода C ++, из быстрой проверки, но это не значит, что оно гарантировано.) Если это правда, то можно различить явно установленное значение по умолчанию и неустановленное ранее.к сериализации .

  2. Если я явно установлю для поля значение по умолчанию (например, ноль), а затем сериализую этот объект и отправлю его по проводам, будет ли это значениеотправлено или нет?Если это не так, то очевидно, что любой код, который получает этот объект, не может различить явно установленное значение по умолчанию и неустановленное значение.Т.е. невозможно различить эти два случая после сериализации - Bar :: has_foo () вернет false в обоих случаях.

Если этоневозможно отличить, какой метод рекомендуется использовать для кодирования поля protobuf, если я хочу кодировать необязательное необязательное значение?На ум приходит пара вариантов, но ни один из них не выглядит великолепным: (а) добавить дополнительное логическое поле, которое записывает, установлено ли поле или нет, или (б) использовать «повторное» поле, даже если я семантически хочу дополнительное поле -таким образом я могу определить разницу между отсутствием значения (список длины ноль) или заданным значением (список длины один).

1 Ответ

29 голосов
/ 09 февраля 2012

Следующее применимо к синтаксису «proto2», а не «proto3»:

Понятие установленного поля или нет - это базовая функция в Protobuf .Если вы установите в поле значение (любое значение), то соответствующий has_xxx метод должен вернуть значение true, в противном случае у вас будет ошибка в API.

Если вы не установили поле, а затем сериализовали сообщение, значение для этого поля не отправлялось.Принимающая сторона проанализирует сообщение, обнаружит, какие значения включены, и установит соответствующие значения "has_xxx".

Точно, как это реализовано в проводном формате, документировано здесь: http://code.google.com/apis/protocolbuffers/docs/encoding.html.короткая версия заключается в том, что сообщение кодируется как последовательность пар ключ-значение, и в закодированное сообщение включаются только поля, которые явно установлены.

Значения по умолчанию вступают в действие только при попытке прочитать неустановленное поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...