Az önce serileştiriciler üzerinde dahili bir çalışma yaptık, işte bazı sonuçlar (benim gelecekteki referansım için de!)
Thrift = serileştirme + RPC yığını
En büyük fark, Thrift'in sadece bir serileştirme protokolü olmaması, modern bir SOAP yığını gibi tam gelişmiş bir RPC yığını olmasıdır. Yani serileştirme sonra, nesneler olabilir (ama zorunlu) TCP / IP üzerinden makineler arasında gönderilecektir. SOAP'ta, mevcut hizmetleri (uzak yöntemler) ve beklenen bağımsız değişkenleri / nesneleri tam olarak açıklayan bir WSDL belgesiyle başladınız. Bu nesneler XML yoluyla gönderildi. Thrift'te .thrift dosyası, mevcut yöntemleri tam olarak açıklar, beklenen parametre nesneleri ve nesneler, mevcut serileştiricilerden biri aracılığıyla serileştirilir ( Compact Protocol
üretimde en popüler olan verimli bir ikili protokol ile).
ASN.1 = Büyük baba
ASN.1, 80'lerde telekom çalışanları tarafından tasarlandı ve CompSci çalışanlarından çıkan son serileştiricilerle karşılaştırıldığında sınırlı kütüphane desteği nedeniyle kullanımı garip . DER (ikili) kodlama ve PEM (ascii) kodlaması olmak üzere iki varyant vardır. Her ikisi de hızlıdır, ancak DER daha hızlıdır ve ikisinden de daha verimlidir. Aslında ASN.1 DER, 30 yıl boyunca tasarlanmış serileştiricileri kolayca sürdürebilir (ve bazen yenebilir).kendinden sonra, iyi tasarlanmış tasarımının bir kanıtı. Çok kompakttır, Protocol Buffers ve Thrift'ten daha küçüktür, yalnızca Avro tarafından yenilir. Sorun, desteklenecek harika kitaplıklara sahip olmak ve şu anda Bouncy Castle, C # / Java için en iyisi gibi görünüyor. ASN.1, güvenlik ve kripto sistemlerinde kraldır ve ortadan kalkmayacaktır, bu nedenle 'geleceğe yönelik prova' konusunda endişelenmeyin. Sadece iyi bir kütüphane edinin ...
MessagePack = paketin ortası
Fena değil ama ne en hızlı, ne de en küçüğü ne de en iyi desteklenen. Onu seçmek için üretim nedeni yok.
Yaygın
Bunun ötesinde, oldukça benzerler. Çoğu, temel TLV: Type-Length-Value
ilkenin varyantlarıdır .
Protokol Arabellekleri (Google kaynaklı), Avro (Apache tabanlı, Hadoop'ta kullanılıyor), Thrift (Facebook kaynaklı, şimdi Apache projesi) ve ASN.1 (Telekom kaynaklı), verilerinizi bir serileştiricide ilk olarak ifade ettiğiniz bir düzeyde kod üretmeyi içerir -özel biçim, ardından serileştirici "derleyici" code-gen
aşama aracılığıyla diliniz için kaynak kodu üretecektir . Uygulama kaynağınız daha sonra bu code-gen
sınıfları IO için kullanır . Bazı uygulamaların (ör. Microsoft'un Avro kitaplığı veya Marc Gavel'in ProtoBuf.NET) uygulama düzeyinde POCO / POJO nesnelerini doğrudan dekore etmenize izin verdiğini ve ardından kitaplığın herhangi bir kod geninin sınıfları yerine doğrudan bu dekore edilmiş sınıfları kullandığını unutmayın. Bunun bir nesne kopyalama aşamasını ortadan kaldırdığı için (uygulama düzeyinde POCO / POJO alanlarından kod oluşturma alanlarına kadar) performans artışı sunduğunu gördük.
Oynamak için bazı sonuçlar ve canlı bir proje
Bu proje ( https://github.com/sidshetye/SerializersCompare ) C # dünyasındaki önemli serileştiricileri karşılaştırır. Java halkının zaten benzer bir şeyi var .
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!)