J'ai besoin de spécifier un message avec un champ optionnel dans protobuf (syntaxe proto3). En termes de syntaxe proto 2, le message que je veux exprimer est quelque chose comme :
message Foo {
required int32 bar = 1;
optional int32 baz = 2;
}
D'après ce que j'ai compris, le concept "optionnel" a été supprimé de la syntaxe proto 3 (avec le concept obligatoire). Bien que l'alternative ne soit pas claire - utiliser la valeur par défaut pour indiquer qu'un champ n'a pas été spécifié par l'expéditeur, laisse une ambiguïté si la valeur par défaut appartient au domaine des valeurs valides (considérez par exemple un type booléen).
Alors, comment suis-je censé coder le message ci-dessus ? Merci.
0 votes
L'approche ci-dessous est-elle une bonne solution ? message NoBaz { } message Foo { int32 bar = 1 ; oneof baz { NoBaz undefined = 2 ; int32 defined = 3 ; } ; }.
2 votes
Il y a une version Proto 2 de cette question si d'autres personnes trouvent cela mais utilisent Proto 2.
3 votes
Proto3 rend tous les champs facultatifs. Cependant, pour les scalaires, ils ont rendu impossible la distinction entre "champ non défini" et "champ défini mais avec une valeur par défaut". Si vous enveloppez votre scalaire dans un singleton oneof, par exemple : - message blah { oneof v1 { int32 foo = 1 ; } }. }, vous pouvez alors vérifier à nouveau si foo a effectivement été défini ou non. Pour Python au moins, vous pouvez opérer directement sur foo comme s'il n'était pas à l'intérieur d'un oneof et vous pouvez demander HasField("foo").
2 votes
@MaxP Vous pourriez peut-être changer la réponse acceptée en stackoverflow.com/a/62566052/66465 puisqu'une version plus récente de protobuf 3 a maintenant
optional