Pergunta

Usando o Google Protocul Buffers , eu tenho um serviço já escrito em Java que tem a sua estruturas de dados próprios já. Eu gostaria de usar pb para entrega de mensagens e eu estou procurando uma maneira para serializar as estruturas de dados existentes que tenho em Java para pb. Posso começar por definir todas as estruturas de dados no pb a partir do zero, o que provavelmente é o caminho certo para ir, mas eu sou muito preguiçoso. Então, digamos que eu tenho uma classe Pessoa em Java (ou outros idiomas suportados) ou uma classe Plane, que tem dezenas de atributos nele, há uma maneira para serializar dessa classe para pb? Posso ter um atributo pb do tipo Plane? (Quando o avião não é um pb, é uma classe Java)

Foi útil?

Solução

Não, você não pode. Campos em mensagens protobuf são sempre os primitivos (números, strings e matrizes de bytes, basicamente), enums protobuf (que são gerados como enums Java) ou mensagens protobuf -. E versões repetidas de todos aqueles, claro

Você poderia escrever uma ferramenta que usou reflexão para criar um arquivo .proto de uma classe Java, mas eu suspeito que você encontrá-lo mais rápido apenas para fazê-lo com a mão. Em particular, se você se usar a reflexão que você gostaria de ter certeza de que os campos foram sempre gerados com o mesmo nome, para manter a compatibilidade. Uma coisa que você poderia fazer é anotar as classes e escrever código Java para gerar o arquivo .proto com base nessas anotações - ou até mesmo potencialmente serialize diretamente para o formato proto usando as anotações. Pessoalmente eu recomendo a criação do arquivo .proto em alguns maneira, em vez de efetivamente reescrever o projeto PB -. Caso contrário, há um risco significativo de introduzir erros onde já está exaustivamente testado código

Se você do criar um sistema de anotação, tenho certeza Kenton Varda (eo resto da comunidade PB) estaria interessado em vê-lo.

Outras dicas

Uma maneira que eu posso pensar é ter um campo de cadeia em um protobuf e serializar uma classe Java para o campo usando serialização primitivo de Java. Dessa forma, supondo que o receptor da mensagem sabe ler / desserializá-lo, eu posso facilmente serializar Java para mensagens Java.

Existem desvantagens para esta técnica, no entanto. Para citar alguns:

  1. É apenas Java para Java (não C ++, Python ou outros)
  2. Não é tão eficiente quanto protobufs nativas são (nem análise / serializatin sábio nem o tamanho da mensagem sábio)
  3. Você tem a lógica das estruturas de dados espalhados em vários lugares, alguns estão no arquivo de definição de protobufs, alguns em outras classes Java e isso torna as coisas mais difíceis de manter.

Mas -. Ele começa o trabalho feito para o curto prazo

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