La sintaxis 3 de protobuf hizo que todos los campos fueran opcionales eliminando las palabras clave required
y optional
de la sintaxis proto2 anterior. Al leer algunos comentarios de los desarrolladores , parece que se hizo para mejorar la compatibilidad binaria hacia adelante / hacia atrás.
Pero para mí, eso podría hacerse cumplir simplemente versionando los nombres de los paquetes, digamos com.example.messages.v1
y luego permitiendo que los clientes implementen deserializadores que entiendan. Al mismo tiempo, elimina algunos contratos establecidos como un tipo que son útiles desde el punto de vista de la ingeniería de software. Por ejemplo si tengo
message Location {
double latitude = 1;
double longitude = 2;
}
En proto3 es posible crear un medio respaldado pero perfectamente válido Location
al no proporcionar uno de los campos obligatorios.
¿No es un gran inconveniente al crear un formato de serialización basado en esquemas para el intercambio de datos entre clientes? ¿No es peor mover el código de validación adicional a cada cliente comprobando que todos los campos obligatorios tienen valores válidos?
fuente
Respuestas:
proto3 realiza una serie de cambios destinados (según tengo entendido) a hacer que sea mucho más utilizable en escenarios multiplataforma. El seguimiento explícito de "asignado" frente a "no asignado pero que informa el valor predeterminado" puede ser muy difícil de implementar en algunas de las plataformas de destino, y también puede ser confuso de usar. Como tal, proto3 adopta un enfoque mucho más simple:
El otro valor es: cero. El hecho de que no lo haya asignado explícitamente a cero es discutible. Depende de usted si esto es deseable o no, pero tiene sentido para mí y es cómo funciona una gran cantidad de "inicializar un nuevo objeto / estructura" en una amplia gama de plataformas.
¡No hay nada que validar! El diseño es exactamente lo que sería si el valor cero se asignara explícitamente. Si eso es legal, es legal. Si es ilegal (porque cero no tiene sentido para usted), es ilegal; pero sería ilegal si fuera explícito o implícito. La cantidad de validación involucrada no cambia.
Por lo general, no, no ... especialmente porque la versión del esquema es explícita. Si desea usar proto2: use proto2. Nada cambia automáticamente.
fuente