Usando GPB, ¿cómo hago que mis clases de envoltura dejen de aceptar mensajes binarios que no son para ellos?

StackOverflow https://stackoverflow.com/questions/1681263

  •  16-09-2019
  •  | 
  •  

Pregunta

Estoy usando Buffers de protocolo de Google Para serializar algunos de mis objetos comerciales (en una aplicación Java). Como se recomienda en los tutoriales, envuelvo el constructor de mensajes en una clase propia que implementa métodos Getter y Setter para acceder a las propiedades del mensaje. Además, declaré todos los campos de mensajes optional, nuevamente siguiendo sus recomendaciones.

Ahora, puedo dar a cualquiera de las clases de envoltura cualquiera de los mensajes codificados y siempre los analizarán y los aceptarán. Esto lleva a objetos de envoltura que representan un tipo de mensaje que en realidad no contienen y sucede mucho falso.

Al cargar el contenido binario de un mensaje en una clase de envoltorio, ¿cómo puedo hacer que arroje un error si se ha pasado por el tipo incorrecto?

La solución en la que estoy pensando actualmente tendría todos los mensajes extender un mensaje base con un campo de tipo requerido (y tal vez un campo de versión). Esto tendría que la clase generada de constructor lanza una excepción si faltan esos campos, y si están allí, puedo verificar mi propio código. Sin embargo, aún no he terminado de evaluar qué repercusiones tiene esto para mi código, y no estoy seguro de que esto vaya a ser fácil.

¿Fue útil?

Solución 2

Esto también parece ser lo que otras personas hacen, y funciona bien para mí:

message TypedMessage {
    required string type = 1;
    required bytes payload = 2;
}

El mensaje real entra en el campo de carga útil en forma serializada y el tipo se utiliza para obtener la clase adecuada de constructor y envoltorio. El campo también podría ser un enum, actualmente estoy usando nombres de clase Java, que probablemente reemplazaré por un sistema diferente más adelante, ya que esto significa que la refactorización rompe la compatibilidad hacia atrás del analizador.

Otros consejos

Si los datos que pasan a myMessage.ParseFrom () no representan un mensaje de ese tipo, obtendrá un InvalidProtocolBufferException. ¿No es eso suficiente para ti?

Los mensajes de PB no se autodescriben, por lo que debes saber (de alguna manera) qué mensaje está tratando de analizar. Por supuesto, puede intentar analizarlos y atrapar InvalidProtocolbufferException, pero eso no es muy agradable. En cambio, creo que la mayoría de las personas están utilizando el enfoque que está describiendo: use una clase de mensaje base con un campo tipo (generalmente un enum) y una serie de campos opcionales, uno para cada posible subtipo. Esto le permite analizar el mensaje y luego encender el tipo de mensaje para extraer la "carga útil" real del mensaje.

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