Question

En utilisant les tampons de protocole de Google, j'ai déjà un service écrit en Java qui a propres structures de données déjà. J'aimerais utiliser pb pour la livraison des messages et je cherche un moyen de sérialiser les structures de données existantes que j'ai en Java sur pb. Je peux commencer par définir toutes les structures de données dans pb à partir de zéro, ce qui est probablement la bonne façon de procéder, mais je suis trop paresseux. Alors, disons que j'ai une classe Person en Java (ou d'autres langages pris en charge) ou une classe Plane qui contient des dizaines d'attributs, existe-t-il un moyen de sérialiser cette classe en pb? Puis-je avoir un attribut pb de type Plane? (quand Plane n'est pas un pb, c'est une classe Java)

Était-ce utile?

La solution

Non, vous ne pouvez pas. Les champs dans les messages protobuf sont toujours les primitives (nombres, chaînes et tableaux d'octets, en gros), les protobuf enums (qui sont générés sous forme d'énums Java) ou les messages protobuf - et des versions répétées de tous, bien sûr.

Vous pourriez potentiellement écrire un outil utilisant la réflexion pour créer un fichier .proto à partir d'une classe Java, mais je suppose que vous le trouverez plus rapidement si vous le faites à la main. En particulier, si vous utilisez la réflexion, vous souhaitez vous assurer que les champs ont toujours été générés avec le même nom, afin de maintenir la compatibilité. Une des choses que vous pouvez faire est d’annoter les classes Java et d’écrire du code pour générer le fichier .proto en fonction de ces annotations - ou même de potentiellement sérialiser directement au format proto à l’aide des annotations. Personnellement, je recommanderais de créer le fichier .proto à la manière plutôt que de réécrire efficacement le projet PB - sinon, le risque d’introduction de bogues serait important, car le code a déjà été testé de manière approfondie.

Si vous créez un système d'annotation, je suis certain que Kenton Varda (et le reste de la communauté PB) serait intéressé à le voir.

Autres conseils

Une façon dont je peux penser est d’avoir un champ de chaîne dans un protobuf et de sérialiser une classe Java sur ce champ en utilisant la sérialisation primitive de Java. Ainsi, en supposant que le destinataire du message sache le lire / le désérialiser, je peux facilement sérialiser les messages de Java à Java.

Il existe cependant des inconvénients à cette technique. Pour en nommer quelques-uns:

  1. Il n'y a que Java à Java (pas de C ++, Python ou autres)
  2. Ce n'est pas aussi efficace que les protobufs natifs (non plus en termes d'analyse / sérialisation ni de taille de message)
  3. La logique des structures de données est dispersée à plusieurs endroits, certaines se trouvent dans le fichier de définition des protobufs, d'autres dans d'autres classes Java, ce qui rend les choses plus difficiles à gérer.

Mais - le travail est fait à court terme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top