Подтвердить что ты не робот

Почему в proto3 нет пользовательских значений по умолчанию?

Версия протоколов протокола proto2 позволяет указывать значения по умолчанию для элементов сообщения:

optional double scaling_factor = 3 [default = 1.0];

Почему это невозможно в proto3? Я считаю эту опрятную функцию экономить дополнительные байты на проводе без необходимости писать код оболочки.

4b9b3361

Ответ 1

Я понимаю, что proto3 больше не позволяет обнаруживать присутствие на местах и ​​больше не поддерживает ненулевые значения по умолчанию, поскольку это упрощает реализацию protobufs в терминах "простых старых структур" на разных языках без необходимости генерации методы доступа. Это воспринимается как упрощение использования Protobuf на этих языках.

(Я лично считаю, что языки, которые не имеют аксессуаров и свойств, не очень хорошие языки, и protobuf не должен проектировать их, но это не мой проект больше.)

Ответ 2

В моем автогенерированном файле .pb.cc я вижу несколько таких мест:

if (this->myint() != 0) {

и несколько таких:

myint_ = 0;

Итак, почему бы не включить значение по умолчанию и сгенерировать

static ::google::protobuf::int32 myint_defaultvalue = 5;

...
if (this->myint() != myint_defaultvalue) {
...

...
myint_ = myint_defaultvalue;
...

вместо

Ответ 3

Это обходной путь вместо прямого ответа на ваш вопрос, но я обнаружил, что использую необязательные значения wrappers.proto, а затем сам устанавливаю значение по умолчанию, когда мне абсолютно необходимо знать, было ли это значение по умолчанию или значение, которое было явно установлено.

Не оптимально, чтобы ваш код принудительно применял значение вместо самого сгенерированного кода, но если вы владеете обеими сторонами, по крайней мере, это жизнеспособная альтернатива, по сравнению с отсутствием представления о том, было ли это значение по умолчанию или установленным как таковой, особенно при рассмотрении bool установлен в false.

Мне неясно, как это влияет на байты в проводе. Для случаев, когда я использовал это, длина сообщения не была ограничением дизайна.

Прото Файл

import "google/protobuf/wrappers.proto";

google.protobuf.BoolValue optional_bool = 1;

Java-код

//load or receive message here
if( !message.hasOptionalBool() )
    message.setOptionalBool( BoolValue.newBuilder().setValue( true ) );