как методы has_field () соотносятся со значениями по умолчанию в protobuf?

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

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

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

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

23
задан Edward Loper 6 February 2012 в 22:08
поделиться