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 …
- ¿Cómo get opciones personalizadas en el plugin de protocolos para Java?
- Protocolo Buffer de soporte gradle para Android Kotlin no funciona?
- ¿Cómo build buffers de protocolo de Google y Kotlin usando Gradle?
- kapt no resuelve las classs generadas por protobuf
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.