Значение параметра Proto3, равное по умолчанию, не распознается во время выполнения

Proto3 не такой строгий, как Proto2 , и нет required или optional полей, никаких default значений по default .

Учитывая следующее определение …

 message Order { enum Side { BID = 0; ASK = 1; } int64 time = 1; double price = 2; double volume = 3; Side side = 4; } 

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

Таким образом, значение по умолчанию для time равно 0 , price равна 0.0 а sideBID , если вы печатаете экземпляр, в котором вы не предоставили одно из полей, или предоставили значение по умолчанию, тогда время выполнения будет обрабатывать его, поскольку оно никогда не предоставлялось в обоих случаях, поэтому его невозможно определить, было ли значение установлено вручную в BID или было принято по умолчанию.

Например, если мы выполним следующий код (его котлин)

 Order.newBuilder() .setPrice(1.0) .setVolume(2.0) .setSide(Order.Side.BID) .build() .apply { println(this) } 

у нас будет этот выход

 price: 1.0 volume: 2.0 

по крайней мере, это раздражает, когда вы печатаете прото-объекты с помощью стандартного .toString() или json-принтера, у вас будет этот обрезанный вывод …

 { "price": 1.0, "volume": 2.0 } { "price": 1.0, "volume": 2.0, "side": "ASK" } { "price": 1.0, "volume": 2.0 } { "price": 1.0, "volume": 2.0, "side": "ASK" } 

Но что, если ваш клиент не обязательно заботится о значениях по умолчанию и ожидает, что все поля будут присутствовать?

Вопрос: есть ли способ изменить это поведение? по крайней мере, как мы гарантируем, что если значение было установлено, оно отображается?

Может быть, есть способ сказать protoc генерировать другой код (влияющий на поведение по умолчанию) …

    Если вы хотите, чтобы значение параметра Proto2 по умолчанию и заданное / неустановленное поведение, вы должны вернуться к Proto2. Маловероятно, что Proto2 уйдет в ближайшее время, так как от него все еще зависит много кода (в том числе внутри Google), и он разделяет большую часть своей реализации с Proto3. Подумайте о proto2 vs. proto3 как опцию (точную опцию, которую вы ищете, фактически), а не изменение версии.