web-dev-qa-db-fra.com

Pourquoi n'y a-t-il pas de valeurs par défaut personnalisées dans proto3?

La version proto2 de Protocol Buffers permet de spécifier des valeurs par défaut pour les éléments de message:

optional double scaling_factor = 3 [default = 1.0];

Pourquoi cela n'est-il plus possible dans proto? Je considère que c'est une fonctionnalité intéressante pour économiser des octets supplémentaires sur le fil sans avoir besoin d'écrire de code wrapper.

35
Daniel Pauli

Ma compréhension est que proto3 ne vous permet plus de détecter la présence sur le terrain et ne prend plus en charge les valeurs par défaut non nulles car cela facilite la mise en œuvre de protobufs en termes de "vieilles structures simples" dans diverses langues, sans avoir besoin de générer des méthodes d'accesseur. Ceci est perçu comme facilitant l'utilisation de Protobuf dans ces langues.

(Personnellement, je pense que les langues qui manquent d'accesseurs et de propriétés ne sont pas de très bonnes langues et protobuf ne devrait pas être conçu pour elles, mais ce n'est plus mon projet.)

48
Kenton Varda

Dans mon fichier généré automatiquement .pb.cc, je vois peu d'endroits comme celui-ci:

if (this->myint() != 0) {

et peu comme ça:

myint_ = 0;

Alors, pourquoi ne pas activer la valeur par défaut et générer

static ::google::protobuf::int32 myint_defaultvalue = 5;

...
if (this->myint() != myint_defaultvalue) {
...

...
myint_ = myint_defaultvalue;
...

au lieu?

1
Ilyan

Il s'agit d'un travail autour d'une réponse directe à votre question, mais je me suis retrouvé à utiliser des valeurs facultatives wrappers.proto, puis à définir moi-même la valeur par défaut lorsque je dois absolument savoir s'il s'agissait d'une valeur par défaut ou d'une valeur qui était explicitement défini.

Il n'est pas optimal que votre code applique la valeur au lieu du code généré lui-même, mais si vous possédez les deux côtés, au moins c'est une alternative viable par rapport à ne pas avoir la moindre idée si la valeur était la valeur par défaut ou explicite définie en tant que telle, en particulier lorsque vous regardez un booléen mis à faux.

Je ne sais pas comment cela affecte les octets sur le fil. Pour les cas où je l'ai utilisé, la longueur du message n'était pas une contrainte de conception.

Fichier Proto

import "google/protobuf/wrappers.proto";

google.protobuf.BoolValue optional_bool = 1;

Code Java

//load or receive message here
if( !message.hasOptionalBool() )
    message.setOptionalBool( BoolValue.newBuilder().setValue( true ) );
0
Evan