Abbiamo appena fatto uno studio interno sui serializzatori, ecco alcuni risultati (anche per mio futuro riferimento!)
Risparmio = serializzazione + stack RPC
La differenza più grande è che Thrift non è solo un protocollo di serializzazione, è uno stack RPC completo che è come uno stack SOAP moderno. Quindi, dopo la serializzazione, gli oggetti potrebbero (ma non obbligatori) essere inviati tra macchine su TCP / IP. In SOAP, si è iniziato con un documento WSDL che descrive completamente i servizi disponibili (metodi remoti) e gli argomenti / oggetti previsti. Questi oggetti sono stati inviati tramite XML. In Thrift, il file .thrift descrive completamente i metodi disponibili, gli oggetti dei parametri previsti e gli oggetti vengono serializzati tramite uno dei serializzatori disponibili (con Compact Protocol
un protocollo binario efficiente, essendo il più popolare nella produzione).
ASN.1 = Nonno
ASN.1 è stato progettato da persone delle telecomunicazioni negli anni '80 ed è scomodo da usare a causa del supporto limitato delle librerie rispetto ai recenti serializzatori emersi da CompSci. Esistono due varianti, la codifica DER (binaria) e la codifica PEM (ascii). Entrambi sono veloci, ma DER è più veloce e più efficiente in termini di dimensioni dei due. In effetti ASN.1 DER può facilmente tenere il passo (e talvolta battere) i serializzatori progettati per 30 annidopo di sé, una testimonianza del suo design ben progettato. È molto compatto, più piccolo di Protocol Buffers e Thrift, battuto solo da Avro. Il problema è avere ottime librerie da supportare e in questo momento Bouncy Castle sembra essere il migliore per C # / Java. ASN.1 è il re dei sistemi di sicurezza e crittografia e non andrà via, quindi non preoccuparti della "prova futura". Basta avere una buona libreria ...
MessagePack = metà del pacchetto
Non è male ma non è né il più veloce, né il più piccolo né il meglio supportato. Nessun motivo di produzione per sceglierlo.
Comune
Oltre a ciò, sono abbastanza simili. La maggior parte sono varianti del TLV: Type-Length-Value
principio di base .
I buffer di protocollo (originati da Google), Avro (basato su Apache, utilizzato in Hadoop), Thrift (originato da Facebook, ora progetto Apache) e ASN.1 (originato da Telecom) implicano tutti un certo livello di generazione di codice in cui per prima cosa esprimi i tuoi dati in un serializzatore -formato specifico, quindi il "compilatore" del serializzatore genererà il codice sorgente per la tua lingua tramite la code-gen
fase. L'origine dell'app usa quindi queste code-gen
classi per IO. Nota che alcune implementazioni (ad esempio: la libreria Avro di Microsoft o ProtoBuf.NET di Marc Gavel) ti consentono di decorare direttamente gli oggetti POCO / POJO a livello di app e quindi la libreria utilizza direttamente quelle classi decorate invece delle classi di code-gen. Abbiamo visto che questo offre un aumento delle prestazioni poiché elimina una fase di copia di oggetti (dai campi POCO / POJO a livello di applicazione ai campi di generazione del codice).
Alcuni risultati e un progetto live con cui giocare
Questo progetto ( https://github.com/sidshetye/SerializersCompare ) mette a confronto importanti serializzatori nel mondo C #. La gente di Java ha già qualcosa di simile .
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!)