Règles des champs
Les champs des messages peuvent être modifiés par les règles suivantes :
- singular : le message peut contenir ce champ zéro ou une fois (pas plus). En syntaxe proto3, c'est la règle par défaut.
- singular : le message peut contenir ce champ zéro ou une fois (pas plus). En syntaxe proto3, c'est la règle par défaut.
- repeated : le message peut contenir ce champ autant de fois que nécessaire (y compris zéro), avec l'ordre des valeurs préservé. Cela revient à définir un tableau.
Exemple avec un fichier contact.proto mis à jour : la structure InfoPersonne inclut un champ répété pour les numéros de téléphone.
syntax = "proto3";
package contact;
message InfoPersonne {
string nom = 1;
int32 age = 2;
repeated string numerotelephone = 3;
}
Définition et utilisation des types de message
Dans un fichier .proto, plusieurs messages peuvent être définis, y compris des types imbriqués. Les numéros de champ peuvent se répéter entre messages.
Exemple avec un message Telephone extrait dans contact.proto :
syntax = "proto3";
package contact;
message Telephone {
string numero = 1;
}
message InfoPersonne {
string nom = 1;
int32 age = 2;
}
Les types de messages peuvent être utilisés comme types de champ. On peut importer des messages d'autres fichiers .proto, même si certains utilisent proto2.
Création du carnet d'adresses version 2.0
Pour stocker une liste de contacts, nous étendons le schéma avec un message CarnetAdresses. Compilation :
protoc --cpp_out=. contact.proto
Les fichiers générés contact.pb.h et contact.pb.cc incluent des méthodes comme clear_ pour réinitialiser les champs, des accesseurs get et set, et pour les champs répétés, add_ pour ajouter des éléments et _size pour connaître la taille.
Implémentation de l'écriture pour le carnet 2.0
Utilisation de la macro GOOGLE_PROTOBUF_VERIFY_VERSION pour vérifier la compatibilité de la bibliothèque. En fin de programme, appel à ShutdownProtobufLibrary() pour libérer les ressources globales.
// Exemple simplifié dans write.cc
#include "contact.pb.h"
#include <fstream>
int main() {
GOOGLE_PROTOBUF_VERIFY_VERSION;
// Logique pour créer et écrire des contacts
// ...
google::protobuf::ShutdownProtobufLibrary();
return 0;
}
Exécution et inspection du fichier binaire avec des outils comme hexdump.
Implémentation de la lecture pour le carnet 2.0
Le fichier read.cc décode le fichier binaire et affiche les contacts. ProtoBuf offre une option --decode pour convertir les messages bianires en format texte depuis l'entrée standard.
Types énumérés
Les énumérations sont définies avec des noms en CamelCase et des constantes en MAJUSCULES. La première valeur doit être 0 pour la compatibilité.
enum TypeTelephone {
MOBILE = 0;
FIXE = 1;
}
Attention : les noms de constantes doivent être uniques au même niveau. Les énumérations imbriquées dans des messages créent un niveau différent. Lors de l'importation entre fichiers, si les packages sont déclarés, les espaces de noms sont séparés.
Mise à jour du carnet d'adresses vers la version 2.1
Ajout d'un champ énuméré dans le schéma contact.proto et recompilation :
protoc --cpp_out=. contact.proto
Le code généré inclut désormais des méthodes comme _IsValid pour valider les valeurs d'énumération et _Name pour obtenir le nom. Les champs énumérés disposent d'accesseurs et de clear_ pour la réinitialisation. Mise à jour des fichiers write.cc et read.cc pour intégrer les énumérations, suivie de tests de lecture/écriture.