Nous venons de faire une étude interne sur les sérialiseurs, voici quelques résultats (pour ma future référence aussi!)
Thrift = sérialisation + pile RPC
La plus grande différence est que Thrift n'est pas seulement un protocole de sérialisation, c'est une pile RPC complète qui ressemble à une pile SOAP moderne. Ainsi, après la sérialisation, les objets pourraient (mais pas obligatoires) être envoyés entre les machines via TCP / IP. Dans SOAP, vous avez commencé avec un document WSDL qui décrit entièrement les services disponibles (méthodes distantes) et les arguments / objets attendus. Ces objets ont été envoyés via XML. Dans Thrift, le fichier .thrift décrit complètement les méthodes disponibles, les objets paramètres attendus et les objets sont sérialisés via l'un des sérialiseurs disponibles (avec Compact Protocol
, un protocole binaire efficace, étant le plus populaire en production).
ASN.1 = Grand-papa
ASN.1 a été conçu par des spécialistes des télécommunications dans les années 80 et est difficile à utiliser en raison du support limité des bibliothèques par rapport aux récents sérialiseurs qui ont émergé des gens de CompSci. Il existe deux variantes, le codage DER (binaire) et le codage PEM (ascii). Les deux sont rapides, mais le DER est plus rapide et plus efficace en termes de taille. En fait, ASN.1 DER peut facilement suivre (et parfois battre) les sérialiseurs conçus depuis 30 ans après lui-même, ce qui témoigne de sa conception bien conçue. Il est très compact, plus petit que Protocol Buffers et Thrift, battu uniquement par Avro. Le problème est d'avoir d'excellentes bibliothèques à prendre en charge et pour le moment, Bouncy Castle semble être la meilleure pour C # / Java. ASN.1 est le roi des systèmes de sécurité et de cryptographie et ne va pas disparaître, alors ne vous inquiétez pas pour la `` future preuve ''. Procurez-vous simplement une bonne bibliothèque ...
MessagePack = milieu du pack
Ce n'est pas mal mais ce n'est ni le plus rapide, ni le plus petit ni le mieux supporté. Aucune raison de production pour le choisir.
Commun
Au-delà, ils sont assez similaires. La plupart sont des variantes du TLV: Type-Length-Value
principe de base .
Protocol Buffers (origine Google), Avro (basé sur Apache, utilisé dans Hadoop), Thrift (origine Facebook, maintenant projet Apache) et ASN.1 (origine Telecom) impliquent tous un certain niveau de génération de code où vous exprimez d'abord vos données dans un sérialiseur -spécifique, alors le sérialiseur "compilateur" générera le code source de votre langage via la code-gen
phase. La source de votre application utilise ensuite ces code-gen
classes pour IO. Notez que certaines implémentations (par exemple: la bibliothèque Avro de Microsoft ou ProtoBuf.NET de Marc Gavel) vous permettent de décorer directement les objets POCO / POJO au niveau de votre application, puis la bibliothèque utilise directement ces classes décorées au lieu des classes de code-gen. Nous avons vu cela offrir une amélioration des performances car il élimine une étape de copie d'objet (des champs POCO / POJO de niveau application aux champs code-gen).
Quelques résultats et un projet live avec lequel jouer
Ce projet ( https://github.com/sidshetye/SerializersCompare ) compare les sérialiseurs importants dans le monde C #. Les gens de Java ont déjà quelque chose de similaire .
1000 iterations per serializer, average times listed
Sorting result by size
Name Bytes Time (ms)
------------------------------------
Avro (cheating) 133 0.0142
Avro 133 0.0568
Avro MSFT 141 0.0051
Thrift (cheating) 148 0.0069
Thrift 148 0.1470
ProtoBuf 155 0.0077
MessagePack 230 0.0296
ServiceStackJSV 258 0.0159
Json.NET BSON 286 0.0381
ServiceStackJson 290 0.0164
Json.NET 290 0.0333
XmlSerializer 571 0.1025
Binary Formatter 748 0.0344
Options: (T)est, (R)esults, s(O)rt order, (S)erializer output, (D)eserializer output (in JSON form), (E)xit
Serialized via ASN.1 DER encoding to 148 bytes in 0.0674ms (hacked experiment!)