Protobuf

From air
Jump to navigation Jump to search

Sérialisateur de messages (C++, Java, Node.js, ...)

Alternative : BSON, Avro, Thrift, Cap’n Proto, Msgpack

http://fr.slideshare.net/IgorAnishchenko/pb-vs-thrift-vs-avro

API

ProtoBuf ou Protocol Buffers est un sérialisateur de structures de données. Il implique dans un premier temps, l'utilisation d'une "Interface de Description de Message" qui décrit la structure de données à sérialiser. Il implique dans un second temps, l'utilisation d'un programme (compilateur) générant le code source à partir de ces description. Ce code source est utilisé pour créer et parser des flux de données au format décrit par les messages.
Exemple de description de Message :

message Luminosité {
   required int intensité = 50;         // La propiété "intensité" est obligatoire.
   optional string type = "naturelle";  // La propiété "type" est optionnelle.
}

message Humidité {
   required double taux = 60.0;         // La propiété "taux" est obligatoire.
   optional string lieu = "sol";        // La propiété "lieu" est optionnelle.
}

La conception de Protobuf par Google s'est axée sur un usage interne. Cependant plusieurs compilateurs pour différents langages (C++, C#, Python, Java, Ruby, NodeJS, etc.) ont été développé et mis à disposition sous licence gratuite. Voici quelques exemples d'usages pour les langages Node.js, Python et Java.

Node.js

Installation

Rien de plus simple pour l'installer:

 npm install protocol-buffers

Utilisation

Soit un fichier test.proto

message Luminosité {
   required int intensité = 50;         // La propiété "intensité" est obligatoire.
   optional string type = "solaire";    // La propiété "type" est optionnelle.
}

Encodage :

var protobuf = require('protocol-buffers')

var messages = protobuf(fs.readFileSync('test.proto'))

var buf = messages.Test.encode({
  intensité: 42,
  type: 'néon'
})

Décodage :

var obj = messages.Test.decode(buf)
console.log(obj) // devrait afficher un objet similaire à celui du dessus

Voici quelques liens utiles pour d'autres exemples https://github.com/mafintosh/protocol-buffers https://www.npmjs.org/package/node-protobuf

Python

Installation

Un guide d'installation détaillé se trouve ici.

Utilisation

Avec Python, il s'agit dans un premier temps de compiler les buffers (ProtoBuf) à partir des messages.proto prédéfinis:

protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/messages.proto

Il suffit ensuite d'utiliser :

  • SerializeToString(): pour sérialiser le message et retourner un type String.
  • ParseFromString(data): pour parser le message à partir d'un type String.

Des exemples détailler se trouvent iciici.

Java

Utilisation

L'utilisation est à peu près similaire : on commence par compiler

protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/messages.proto

Ceci génère un fichier MessageProto.java qui fourni tous les outils nécessaires aux encodage et décodage.

Des exemples détailler se trouvent iciici.

Avec Maven : http://stackoverflow.com/questions/1578456/integrate-protocol-buffers-into-maven2-build

Conversion

Il existe plusieurs méthode et outils de conversion des 'JSON en ProtoBuf et vis-versa.

Une méthode de conversion consiste à utiliser protobuf-java-format.
Voici Un exemple de conversion de ProtoBuf vers JSON :

JsonFormat.printToString(protoMessage)

D'autres exemples ont disponibles ici