El valor de configuration de Proto3 igual al pnetworkingeterminado no se reconoce en el time de ejecución

Proto3 no es tan estricto como Proto2 , y no hay campos requinetworking u optional , no hay valores default personalizados.

Dada la siguiente definición …

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

Hay valores pnetworkingeterminados para cualquiera de esos campos, después de todo, ahora no hay reglas de lo que debe o no debe proporcionar antes de que usted .build() su object.

Entonces el valor pnetworkingeterminado para el time es 0 , el price es 0.0 y el side es BID , si imprime una instancia donde no proporcionó uno de los campos o proporcionó el valor pnetworkingeterminado, entonces el time de ejecución lo tratará como nunca fue proporcionado en ambos casos, entonces no es posible determinar si el valor se estableció manualmente en BID o si se tomó como valor pnetworkingeterminado.

Por ejemplo, si ejecutamos el siguiente código (es kotlin)

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

tendremos esta salida

 price: 1.0 volume: 2.0 

al less, esto es molesto ya que cuando imprimes tus objects proto utilizando la .toString() estándar o la impresora json tendrás esta salida recortada …

 { "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" } 

Pero, ¿qué sucede si a su cliente no le importan necesariamente los valores pnetworkingeterminados y espera que todos los campos estén presentes?

Pregunta: ¿hay alguna manera de cambiar este comportamiento? al less, ¿cómo nos aseguramos de que si se estableció el valor, se muestra?

Tal vez haya una manera de decirle a los protoc que generen códigos diferentes (que afectan el comportamiento pnetworkingeterminado) …

    Si desea el valor pnetworkingeterminado de Proto2 y el comportamiento de establecer / deshacer, debe volver a Proto2. Es poco probable que Proto2 desaparezca pronto ya que muchos códigos (incluido el interior de Google) aún dependen de él, y comparte la mayor parte de su implementación con Proto3. Piense en proto2 vs. proto3 como una opción (la opción exacta que está buscando, de hecho) en lugar de un cambio de versión.