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

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

optional double scaling_factor = 3 [default = 1.0];

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

+29
19 окт. '15 в 19:40
источник поделиться
3 ответа

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

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

+37
20 окт. '15 в 5:54
источник

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

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

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

myint_ = 0;

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

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

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

...
myint_ = myint_defaultvalue;
...

вместо

+1
08 нояб. '15 в 17:34
источник

Это обходной путь вместо прямого ответа на ваш вопрос, но я обнаружил, что использую необязательные значения 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 ) );
0
28 мар. '19 в 16:12
источник

Посмотрите другие вопросы по меткам или Задайте вопрос