Usando o GPB, como faço para fazer minhas aulas de wrapper param de aceitar mensagens binárias que não são feitas para elas?

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

  •  16-09-2019
  •  | 
  •  

Pergunta

estou a usar Buffers do Protocolo do Google Para serializar alguns dos meus objetos de negócios (em um aplicativo Java). Conforme recomendado nos tutoriais, envolvi o construtor de mensagens em uma classe própria que implementa métodos Getter e Setter para acessar as propriedades da mensagem. Além disso, declarei todos os campos de mensagem optional, novamente seguindo suas recomendações.

Agora, posso dar a qualquer uma das classes de invólucro qualquer uma das mensagens codificadas e elas sempre as analisarão e aceitam. Isso leva a objetos de invólucro que representam um tipo de mensagem que eles realmente não contêm e muita falsa acontece.

Ao carregar o conteúdo binário de uma mensagem em uma classe de wrapper, como posso fazer com que ele tenha um erro se tiver passado o tipo errado?

A solução que estou pensando atualmente teria todas as mensagens estender uma mensagem básica com um campo de tipo necessário (e talvez um campo de versão). Isso teria a classe Gerated Builder lançar uma exceção se esses campos estiverem faltando e, se estiverem lá, posso verificar meu próprio código. No entanto, ainda não terminei de avaliar quais repercussões isso tem para o meu código, e não tenho certeza se isso será fácil.

Foi útil?

Solução 2

Parece que as outras pessoas também fazem, e funciona bem para mim:

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

A mensagem real entra no campo da carga útil em forma serializada e o tipo é usado para obter a classe adequada do construtor e do invólucro. O campo também pode ser uma enumeração, atualmente estou usando nomes de classe Java, que provavelmente substituirei por um sistema diferente posteriormente, pois isso significa refatorar intervalos de compatibilidade com versões anteriores do analisador.

Outras dicas

Se os dados que você passar para myMessage.parseFrom () não representar uma mensagem desse tipo, você obterá uma concepção invalidProtocolBuffeRexception. Não é suficiente para você?

As mensagens PB não são auto-descritas; portanto, é preciso saber (por alguns meios) qual mensagem você está tentando analisar. Obviamente, você pode tentar analisá -los e pegar o invalidprotocolbufferexception, mas isso não é muito bom. Em vez disso, acho que a maioria das pessoas está usando a abordagem que você está descrevendo: use uma classe de mensagem base com um campo de tipo (geralmente uma enumeração) e vários campos opcionais, um para cada subtipo possível. Isso permite analisar a mensagem e depois ligar o tipo de mensagem para extrair a "carga útil" real da mensagem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top