Skip to main content

Protocol buffers de Google

Google vient de sortir un concurrent de XML qui, d'après ses dires, serait "plus succint, plus rapide, et plus simple". Qu'en est-il?

XML étant un standard universel de facto, est-il vraiment besoin de lui créer un concurrent? Avec XPath pour le requêtage (et même LINQ 2 XML côté Microsoft), XSL/T pour la transformation et la conversion en divers formats, XSD pour la structuration, n'a-t-on pas déjà tout ce que l'on souhaite?

Eh bien non. En .NET, nous avons la sérialisation XML et l'outil xsd.exe qui permettent de travailler sur des instances de classes pour manipuler du XML, mais les autres langages n'ont pas cette facilité. Ils doivent parcourir les documents XML avec DOM ou SAX. Du coup c'est compliqué pour eux (comparez les deux lignes qu'il faut pour lire par sérialisation XML en .NET aux vingt lignes qui permettent la même chose en utilisant le DOM).

Il s'agit donc d'une réponse intéressante de Google à la problématique de la manipulation XML en dehors de .NET.

Grosso-modo, comme Google nous l'indique, les protocols buffers sont d'abord définis dans un fichier .proto:

message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;

enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}

message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}

repeated PhoneNumber phone = 4;
}

Ensuite, on peut directement manipuler le XML via des instances d'objets, comme dans cet exemple:


Person person;
person.set_name("John Doe");
person.set_id(1234);
person.set_email("jdoe@example.com");
fstream output("myfile", ios::out | ios::binary);
person.SerializeToOstream(&output);

On voit tout de suite l'avantage pour des programmeurs Java: plus de DOM, et une manipulation de types du langage, ce qui permet une vérification à la compilation.


En .NET, cela ne va pas nous apporter la simplicité espérée. Car nous pouvons déjà faire la même chose. Pour reprendre l'exemple ci-dessus, il me suffit de déclarer une classe (que je peux aussi me faire générer d'après le XML par xsd.exe):



public class Person
{
    public string name;
    public int id;
    public string email;

    public enum PhoneType
    {
        MOBILE = 0,
        HOME = 1,
        WORK = 2,
    }

    public class PhoneNumber
    {
        public string number;
        public PhoneType type = PhoneType.HOME;
    }

    List<PhoneNumber> phone;
}


Puis d'utiliser le code suivant, strictement équivalent au code précédent Java:



Person person = new Person();
person.name = "John Doe";
person.id = 1234;
person.email = "jdoe@example.com";
XmlSerializer xs = new XmlSerializer(typeof(Person));
xs.Serialize(Console.Out, person);


Nous faisons donc aussi simple et aussi court que les protocol buffers, mais avec l'avantage de ne pas avoir à créer de fichiers .proto ou apprendre un nouveau langage: nos types .NET sont déjà l'équivalent des fichiers .proto.


Google aurait-il simplement réinventé la roue? Oui, mais avec l'avantage de fournir ce superbe outil qu'est la sérialisation XML à des technologies non-.NET comme Java ou C++. Je regrette pour ma part que les .proto ne permettent pas tout simplement de lire du XML.


Reste un autre argument: la rapidité. Google indique que les protocol buffers permettent un traitement plus rapide que le XML, et c'est facile à croire vu que XML est très verbeux. D'ailleurs Microsoft avait utilisé au début un format binaire BAML pour stocker le XAML des applications WPF dans les assemblys.


Au final, que reste-t-il pour nous développeurs .NET? On peut imaginer un outil qui passe des fichiers .proto à des assemblys .NET contenant les mêmes types et inversement. A mon avis il ne faudra pas longtemps avant de voir un tel outil. Du coup nous pouvons continuer à créer et utiliser nos types .NET, ils seront compatibles avec les protocol buffers.

Comments

Unknown said…
Bonjour,
L'article est un peu ancien je vous l'accorde mais je souhaite apporter 2 petites précisions.


Google protocol buffer est une serialisation qui n'est pas a base de XML mais concurrence XML, les messages sont sous un format binaire.

Java propose les même facilites que .NET pour la manipulation de XML parmi les nombreuses API standards, JAXB est la plus proche de ce que vous décrivez (elle fait partie de JEE depuis JEE5)

Protocol buffer propose surtout d'accélérer les temps de traitement et de réduire les volumes de données qui transitent.
Arnaud said…
Merci pour ces précisions, Jérémie. Dans mon article je me suis effectivement mélangé les pinceaux entre XML et non XML. Les protocol buffers sont effectivement un format binaire. Du coup, côté .NET l'équivalent serait la sérialisation binaire.

JAXB semble effectivement similaire à la sérialisation XML de .NET, si ce n'est qu'il faut apparemment annoter le schéma XSD pour modifier le mappage entre classes et XML. En .NET, ça se fait directement sur la classe au moyen d'attributs (les annotations de Java).

Popular posts from this blog

Learn Meteor book available

I'm pleased to announce the general release of my Learn Meteor book. It is now available as an ebook or print book from various sources: Learn Meteor print (paperback) on Lulu Learn Meteor ebook on LeanPub Learn Meteor ebook on Barnes & Noble Learn Meteor ebook on iBooks Learn Meteor ebook on Kobo Learn Meteor ebook on Scribd Learn Meteor ebook on Inktera Page Foundry Learn Meteor ebook on 24symbols Learn Meteor ebook on Amazon US Learn Meteor ebook on Amazon UK Learn Meteor ebook on Amazon France Learn Meteor ebook on Amazon Deutschland Learn Meteor ebook on Amazon Canada Learn Meteor ebook on Amazon India Learn Meteor ebook on Amazon Brasil Learn Meteor ebook on Amazon Mexico Learn Meteor ebook on Amazon España Learn Meteor ebook on Amazon Italia Learn Meteor ebook on Amazon Netherlands Learn Meteor ebook on Amazon Japan Learn Meteor ebook on Amazon Australia More sources are coming soon for the print version. Learn Meteor has been a fun experienc