En utilisant GPB, comment puis-je faire en sorte que mes cours de wrapper arrêtent d'accepter des messages binaires qui ne sont pas destinés à eux?

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

  •  16-09-2019
  •  | 
  •  

Question

j'utilise Tampons de protocole Google Pour sérialiser certains de mes objets commerciaux (dans une application Java). Comme recommandé dans les tutoriels, j'enveloppe le constructeur de messages dans une classe à moi qui implémente les méthodes Getter et Setter pour accéder aux propriétés du message. De plus, j'ai déclaré tous les champs de messages optional, à nouveau en suivant leurs recommandations.

Maintenant, je peux donner à l'une des classes d'emballage n'importe lequel des messages codés et ils les analyseront et les accepteront toujours. Cela conduit à des objets wrapper qui représentent un type de message qu'ils ne contiennent pas réellement et beaucoup de faux se produisent.

Lors du chargement du contenu binaire d'un message dans une classe de wrapper, comment puis-je le faire lancer une erreur si elle a été transmise le mauvais type?

La solution à laquelle je pense actuellement aurait tous les messages étendre un message de base avec un champ de type requis (et peut-être un champ de version). Cela aurait la classe générée de constructeurs de générateur de cours de lancer une exception si ces champs manquaient, et s'ils sont là, je peux vérifier mon propre code. Cependant, je n'ai pas encore fini d'évaluer les répercussions que cela a pour mon code, et je ne suis pas sûr que cela va être facile.

Était-ce utile?

La solution 2

Cela semble être ce que font les autres aussi, et cela fonctionne bien pour moi:

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

Le message réel va dans le champ de charge utile sous forme sérialisée et le type est utilisé pour obtenir le constructeur et la classe de wrapper appropriés. Le champ pourrait également être une énumération, j'utilise actuellement des noms de classe Java, que je remplacerai probablement par un système différent plus tard, car cela signifie que la refactorisation casse la compatibilité en arrière de l'analyseur.

Autres conseils

Si les données que vous transmettez à MyMessage.ParseFrom () ne représentent pas un message de ce type, vous obtiendrez une invalidprotocolbuffeReXception. N'est-ce pas suffisant pour vous?

Les messages PB ne se décrivent pas, donc besoin de savoir (par certains moyens) quel message vous essayez d'analyser. Bien sûr, vous pouvez essayer de les analyser et de saisir InvalidprotocolBufferexception, mais ce n'est pas très sympa. Au lieu de cela, je pense que la plupart des gens utilisent l'approche que vous décrivez: utilisez une classe de messages de base avec un champ de type (généralement une enum) et un certain nombre de champs facultatifs, un pour chaque sous-type possible. Cela vous permet d'analyser le message, puis d'activer le type de message pour extraire la "charge utile" réelle du message.

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