Protocol Buffers, pour l'échange de données au-delà de JSON

Protocol Buffers est un langage de définition de données créé par Google que l'on peut comparer à IDL, mais qui est beaucoup plus simple. Sa syntaxe, basée sur celle du langage C, évoque celle de JSON, avec pour différence l'utilisation de variables typées.
Google a défini ce langage pour l'utiliser sur ses propres serveurs qui stockent et échangent des quantités de données structurées, et en 2008 à décider de le mettre en open source. Il est utilisé dans Android pour accélérer les échanges avec le serveur (dans Marketplace par exemple).

Les fichiers protos ont un double format, le source lisible par l'homme et le binaire qui peut être traité rapidemment par la machine.
On peut l'utiliser pour trois raisons parmi d'autres:

Un format simple avec des outils évolués

D'abord, quelques définitions pour y voir plus clair:

Protocol Buffers: nom du langage et nom des unités de données encapsulées dans les fichiers protos.
Proto: un fichier de définition de données dans le langage PB et d'extension .proto.
Protoc: nom du compilateur qui génére des classes ou un fichier binaire.

Caractéristiques du langage

Syntaxe

Chaque source a la forme:

message nom     {     
  ...liste de champs de données...   
 }

Les principaux types de données scalaires sont string, int32, int64, float, double, bool.
Les variables peuvent être déclarées avec le modifieur required, optional, repeated.

On leur assigne un numéro d'ordre qui est une directive au compilateur et non une valeur pour la variable.

required string x = 1  // ce n'est pas la valeur 1

On assigne une valeur de départ avec la directive default:

required string x = 1 [default="Un texte"];    

Aux primitives s'ajoutent les types imbriqués, définis en incluant un message dans un autre message:

message contenant
{
  required int32 numero = 1;  
  message contenu
  {
    repeated string x = 1;
  }
}

L'objet "contenu" et ses variables peuvent être accédé par la chaîne: contenant.contenu.x

Des énumérations avec le type enum peuvent être incluses dans les messages.

Quand on a défini la structure d'un message, on l'utilise dans un programme en créant une instance. Et on associe les méthodes propres au message et produites par le compilateur de source proto.

contenant moninstance;
moninstance.set_numero(18);

Exemple de code

Afficher un message.

message hello
{
    required string = 1 [default="le message"];
    optional int32 = 2;
} 

Plus de détails sur le format dans la définition du langage PB.

Téléchargez le compilateur Protoc avec lequel est fournie une documentation complète.

Voir aussi...