Pregunta

Utilizando los Protocul Buffers de Google, tengo un servicio ya escrito en Java que tiene su estructuras de datos propias ya. Me gustaría usar pb para entregar mensajes y estoy buscando una forma de serializar las estructuras de datos existentes que tengo en Java para pb. Puedo comenzar definiendo todas las estructuras de datos en pb desde cero, que probablemente sea el camino correcto, pero soy demasiado vago. Entonces, supongamos que tengo una clase Person en Java (u otros lenguajes compatibles) o una clase Plane que tiene decenas de atributos, ¿hay alguna forma de serializar esa clase en pb? ¿Puedo tener un atributo pb de tipo Plane? (cuando Plane no es un pb, es una clase Java)

¿Fue útil?

Solución

No, no puedes. Los campos en los mensajes protobuf siempre son primitivos (números, cadenas y conjuntos de bytes, básicamente), enumeraciones protobuf (que se generan como enumeraciones Java) o mensajes protobuf, y versiones repetidas de todos ellos, por supuesto.

Podría escribir una herramienta que utilizara la reflexión para crear un archivo .proto a partir de una clase de Java, pero sospecho que lo encontrará más rápido si lo hace a mano. En particular, si usó la reflexión, querrá asegurarse de que los campos siempre se generaron con el mismo nombre, para mantener la compatibilidad. Una cosa que podría hacer es anotar las clases de Java y escribir código para generar el archivo .proto basado en esas anotaciones, o incluso potencialmente serializar directamente a formato proto usando las anotaciones. Personalmente, recomendaría crear el archivo .proto de manera alguna en lugar de reescribir efectivamente el proyecto PB; de lo contrario, existe un riesgo significativo de introducir errores donde ya hay un código probado a fondo.

Si lo hace crea un sistema de anotación, estoy seguro de que Kenton Varda (y el resto de la comunidad de PB) estaría interesado en verlo.

Otros consejos

Una forma en la que puedo pensar es tener un campo de cadena en un protobuf y serializar una clase Java en ese campo utilizando la serialización primitiva de Java. De esa manera, suponiendo que el receptor del mensaje sepa cómo leerlo / deserializarlo, puedo serializar fácilmente mensajes Java a Java.

Sin embargo, hay desventajas en esta técnica. Por nombrar algunos:

  1. Es solo Java a Java (no C ++, Python u otros)
  2. No es tan eficiente como los protobufs nativos (ni el análisis / serialización ni el tamaño del mensaje)
  3. Tiene la lógica de las estructuras de datos dispersas en varios lugares, algunas están en el archivo de definición de protobufs, otras en otras clases de Java y esto hace que las cosas sean más difíciles de mantener.

Pero, hace el trabajo a corto plazo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top