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

Gift idea : help your loved ones take their IT skills to the next level

You surely know a special person who works in IT. Learn Kubernetes & Docker enables them to quickly ramp up on those two technologies that one doesn't want to miss in 2021. With smoother operations, better scaling and availability, DevOps tooling, containers and containers orchestration smartly solve many problems that developers and system administrators commonly face. Don't let your loved ones face problems in their IT job : offer them the book that takes them from zero to productive in a matter of days. Grab it now! Get the ebook from Leanpub , Amazon or choose from many retailers . Get the print edition from Lulu .  

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 expe...

Learn ASP.NET Core: read the book as it is being written

     TL;DR: get the discounted book now using the coupon , then get the full version for free. Thanks to the great acceptance of my previous books, ( Learn WPF MVVM ,  Learn ASP.NET MVC and Learn Meteor ), I'm in the process of writing a fourth one. Learn ASP.NET Core - MVC and DI with .NET Core 1.1 using Visual Studio 2017 teaches you how to quickly get coding using that technology. Just as I did previously, I'm publishing it before it is even finished. Would you like to read it? You can get it for half the price: 50% off the book using that coupon (limited to the first 100 readers and up to august 1st 2017): http://leanpub.com/netcore/c/K9mHH0IzfI2F About 50% of the book is already written, yet it is already available for download as an ebook: PDF, EPUB, MOBI: you choose your format. Over the next days I'll be writing the rest of the book, and publishing updates often. The final book will be ready by au...