2017-08-29 4 views
1

En utilisant la dernière protobuf-net proto2 .proto fichiers que j'ai essayé sur Marc's site's generator:Pourquoi protobuf-net pour proto2 .protos ne génère pas de valeurs par défaut pour les champs obligatoires?

syntax = "proto2"; 

message my_message { 
    optional string val1 = 1 [default="hello!"]; 
    required uint32 val2 = 2 [default="4"]; 
} 

Pour le champ facultatif val1 il ajoute correctement le code de la valeur par défaut, mais il est pas généré pour le val2 nécessaire. Ce que je m'attendais à ce qu'il produise le même code et je n'aurais pas à définir explicitement le champ val2 car il était déjà défini par la valeur par défaut. Pourquoi n'est-ce pas le cas?

Répondre

1

Ceci est une source commune de confusion. Les valeurs par défaut ne font pas ce que vous attendez d'elles. Une valeur par défaut dit exactement: "Si le setter pour ce champ n'a pas été appelé (ou si le message a été analysé depuis le fil, et ce champ n'y était pas présent), alors getter pour ce champ devrait retourner ce valeur."

Les valeurs par défaut sont entièrement locales. Ils ne sont jamais envoyés sur le fil.

Cela signifie que la définition d'une valeur par défaut pour un champ obligatoire est généralement inutile. La seule chose qu'il fait est de déterminer ce que la méthode getter du champ retournera quand l'objet est créé.

Notez également que le but d'un champ required est de forcer l'expéditeur d'un message à appeler l'accesseur du champ avant l'envoi. Si vous ne souhaitez pas que l'expéditeur définisse explicitement le champ, vous devez déclarer le champ optional. (En fait, vous devez toujours déclarer des champs optional, jamais required, mais that's another story.)

(Divulgation:. Je suis l'auteur de proto2-C++, protoc et Cap'n Proto, mais pas proto3)