web-dev-qa-db-fra.com

Héritage dans les tampons de protocole

Comment gérer l'héritage dans Google Protocol Buffers 3.0?

Code équivalent Java:

public class Bar {
    String name;
}
public class Foo extends Bar {
    String id;
}

Quel serait le code équivalent Proto?

message Bar {
    string name = 1;
}
message Foo {
    string id = 2;
}
22
Vivek Sinha

Les tampons de protocole ne prennent pas en charge l'héritage. Envisagez plutôt d'utiliser la composition:

message Foo {
  Bar bar = 1;
  string id = 2;
}

Cependant, cela dit, il y a une astuce que vous pouvez utiliser qui est comme l'héritage - mais qui est un vilain hack, vous ne devez donc l'utiliser qu'avec précaution. Si vous définissez vos types de messages comme:

message Bar {
  string name = 1;
}
message Foo {
  string name = 1;
  string id = 2;
}

Ces deux types sont compatible, car Foo contient un sur-ensemble des champs de Bar. Cela signifie que si vous avez un message codé d'un type, vous pouvez le décoder comme l'autre type. Si vous essayez de décoder un Bar de type Foo, le champ id ne sera pas défini (et obtiendra sa valeur par défaut). Si vous décodez un Foo de type Bar, le champ id sera ignoré. (Notez que ce sont les mêmes règles qui s'appliquent lors de l'ajout de nouveaux champs à un type au fil du temps.)

Vous pouvez éventuellement l'utiliser pour implémenter quelque chose comme l'héritage, en ayant plusieurs types qui contiennent tous une copie des champs de la "superclasse". Cependant, il y a quelques gros problèmes avec cette approche:

  • Pour convertir un objet message de type Foo en type Bar, vous devez sérialiser et ré-analyser; vous ne pouvez pas simplement lancer. Cela peut être inefficace.
  • Il est très difficile d'ajouter de nouveaux champs à la superclasse, car vous devez vous assurer d'ajouter le champ à chaque sous-classe et vous assurer que cela ne crée aucun conflit de numéro de champ.
26
Kenton Varda

Voir le tutoriel Protocol Buffer Basics :

N'allez pas à la recherche d'installations similaires à l'héritage de classe, cependant - les tampons de protocole ne le font pas.

15
Andy Turner