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:
- C'est une alternative à XML bien plus compacte, avec un temps de traitement considérablement diminué.
- Il offre un moyen de stocker des données structurées et de les échanger entre logiciels, éventuellement écrits dans des langages de programmation différents, ainsi qu'entre un serveur et un client.
Une bibliothèque de fonctions est incluse pour aider à l'utiliser dans des services Web. - Il permet la sérialisation de classes indépendante du langage. La sérialisaton produit un code binaire compact et rapide à traiter.
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
- Langage orienté objet, chaque message hérite de la classe Message.
- Langage de données typé.
- Formats textuel et binaire.
- Le compilateur Protoc génère à partir de la définition des données une classe dans le langage voulu.
- Protoc fournit des classes C++ ou Java et est destiné à être compatible avec tous langages.
- La classe est sérialisée dans un fichier binaire. Protoc peut aussi créer directement le binaire à partir du langage PB.
- Une unité est appelé "message". Un fichier .proto peut contenir plusieurs messages.
- Supporte les espaces de noms.
- La structure d'un message est récursif, une structure proto peut avoir pour éléments d'autres structures protos.
- Un champ repeated, comme dans XML, peut avoir sa définition réutilisée dans un même message.
- Dynamiquement extensible.
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...
- Tutoriel protocol Buffers. Première utilisation.
- JSON. Un format plus simple pour JavaScript et les langages coté serveur.
- FlatBuffers. Toujours par Google, un framework de serialisation très rapide, permettant d'utiliser des données stockées sans charger le fichier en mémoire. Un exemple d'utilisation, les données utilisées par un jeu comme cartes, sprites, etc.