Red de conocimiento de abogados - Derecho de sociedades - ¿Cuáles son los tipos de variables de protobuf?

¿Cuáles son los tipos de variables de protobuf?

Para comunicarse, debe haber un acuerdo; de lo contrario, ambas partes no pueden entender el flujo de código del otro. En protobuf, un protocolo se compone de una serie de mensajes. Por tanto, lo más importante es definir el formato de mensaje utilizado en la comunicación.

Definición de mensaje de Protobuf

Un mensaje se compone de al menos un campo, similar a la estructura en lenguaje C. Cada campo tiene un formato determinado.

Formato de campo: Modificador de calificación ① | Tipo de datos ② | Nombre de campo ③ | = | Valor de codificación de campo ⑤ | El modificador de calificación contiene require\optional\repeated

Obligatorio: significa que es un campo obligatorio, que debe ser relativo al remitente. El valor de este campo debe establecerse antes de enviar el mensaje. capaz de identificar este campo. Si el campo requerido no se establece antes del envío o no se puede reconocer, se producirá una excepción de codificación y decodificación, lo que provocará que el mensaje se descarte.

Opcional: Indica que es un campo opcional. Opcional Para el remitente, el valor de este campo se puede configurar o no de forma selectiva al enviar un mensaje. Para el receptor, si se puede reconocer el campo opcional, se procesará en consecuencia. Si no se puede reconocer, el campo se ignorará y otros campos del mensaje se procesarán normalmente. ---Debido a las características del campo opcional, muchas interfaces configuran de manera uniforme los campos agregados posteriormente al campo opcional en la versión actualizada. De esta manera, la versión anterior puede comunicarse con el nuevo software normalmente sin actualizar el programa. el nuevo Los campos no se pueden reconocer porque no todos los nodos requieren nuevas funciones, por lo que se pueden lograr actualizaciones bajo demanda y transiciones sin problemas.

Repetido: Indica que el campo puede contener 0~N elementos. Sus características son las mismas que las opcionales, pero puede contener múltiples valores a la vez. Se puede considerar como pasar una serie de valores.

②. Tipos de datos

Protobuf define un conjunto de tipos de datos básicos. Casi todos se pueden asignar a tipos de datos básicos en lenguajes como C++\Java.

N significa que los bytes empaquetados no son fijos. Más bien, depende del tamaño o la longitud de los datos.

Por ejemplo, int32, si el valor es relativamente pequeño, use un byte para empaquetarlo entre 0 y 127.

El método de empaquetado de enumeración es el mismo que el de uint32.

En cuanto al mensaje, es similar a la estructura en lenguaje C que contiene otra estructura como miembro de datos.

Acerca de la diferencia entre fix32 e int32. La eficiencia de empaquetado de fix32 es mayor que la de int32, pero generalmente usa más espacio que int32. Por lo tanto, uno es eficiente en tiempo y el otro es eficiente en espacio. De acuerdo con la situación real del proyecto, generalmente se selecciona fix32. Si encuentra un entorno con requisitos estrictos sobre la cantidad de datos a transmitir, puede elegir int32.

③. Nombres de campos

La denominación de los nombres de los campos es casi la misma que la denominación de las variables en C, C++, Java y otros lenguajes.

protobuf recomienda que los campos se nombren en mayúsculas y minúsculas separados por guiones bajos. Por ejemplo nombre_nombre en lugar de nombre.

④. Valor de codificación de campo

Con este valor, las partes que se comunican pueden identificar los campos de cada uno. Por supuesto, el mismo valor de codificación debe tener el mismo modificador de calificación y tipo de datos.

El rango de valores del valor codificado es 1~2^32 (4294967296).

Entre ellos, la eficiencia de tiempo y espacio de codificación de 1 a 15 es la más alta. Cuanto mayor es el valor de codificación, menor es la eficiencia de tiempo y espacio de codificación (en relación con 1-15). general La eficiencia de codificación de dos valores adyacentes es la misma, a menos que los dos valores estén en una sección crítica de 4 bytes, 12 bytes, 20 bytes, etc. Por ejemplo, 15 y 16.

Los valores de codificación de 1900 a 2000 son valores reservados internos del sistema protobuf de Google. Se recomienda no utilizarlos en sus propios proyectos. .

protobuf también recomienda configurar la codificación de campo de los valores pasados ​​con frecuencia en un valor entre 1 y 15.

No es necesario que los valores codificados de los campos del mensaje sean consecutivos, siempre que sean legales, y no puede haber campos que contengan el mismo valor codificado en un mismo mensaje.

Recomendación: una vez que el proyecto se haya puesto en funcionamiento, todos los campos de mensajes nuevos involucrados en las actualizaciones de versión deben ser opcionales o repetidos, y tratar de no utilizar los obligatorios. Si se utiliza, toda la red debe actualizarse de manera uniforme. Si se utiliza opcional o repetida, la actualización puede realizarse sin problemas.

⑤. valor predeterminado. Al pasar datos, para el tipo de datos requerido, si el usuario no establece un valor, se utiliza el valor predeterminado para pasar al par. Al recibir datos, para campos opcionales, si no se reciben campos opcionales, se configuran con valores predeterminados.

Acerca de la importación

El archivo de interfaz protobuf puede ser un archivo h en lenguaje C, separado en varios archivos, y los archivos necesarios se pueden importar mediante importación cuando sea necesario. Su comportamiento es más o menos el mismo que #include en lenguaje C o import en java.

Acerca del paquete

Para evitar conflictos de nombres, puede especificar un nombre de paquete para cada archivo, que se resuelve en un paquete en java para java. Para C++ se resuelve en un espacio de nombres.

Acerca del mensaje

Admite mensajes anidados y un mensaje puede contener otro mensaje como campo. También es posible definir un nuevo mensaje dentro de un mensaje.

Acerca de enum

La definición de enumeración es la misma que en C++, pero existen algunas restricciones.

El valor de la enumeración debe ser un número entero mayor o igual a 0.

Utilice punto y coma (;) para separar variables de enumeración en lugar de comas (,) en lenguaje C++

p. ej.

enum VoipProtocol?

{

H323 = 1;

SIP ?= 2;

MGCP = 3;

H248 = 4;

>

}