Kami baru saja melakukan studi internal tentang serializers, berikut beberapa hasilnya (untuk referensi saya di masa mendatang juga!)
Hemat = serialisasi + tumpukan RPC
Perbedaan terbesar adalah bahwa Hemat bukan hanya protokol serialisasi, ini adalah tumpukan RPC lengkap yang seperti tumpukan SOAP modern. Jadi setelah serialisasi, objek bisa (tapi tidak diamanatkan) dikirim antar mesin melalui TCP / IP. Dalam SOAP, Anda mulai dengan dokumen WSDL yang sepenuhnya menjelaskan layanan yang tersedia (metode jarak jauh) dan argumen / objek yang diharapkan. Objek tersebut dikirim melalui XML. Di Thrift, file .thrift menjelaskan sepenuhnya metode yang tersedia, objek parameter yang diharapkan, dan objek diserialkan melalui salah satu serializers yang tersedia (dengan Compact Protocol
, protokol biner yang efisien, yang paling populer dalam produksi).
ASN.1 = Kakek
ASN.1 dirancang oleh orang-orang telekomunikasi di tahun 80-an dan sulit digunakan karena dukungan perpustakaan yang terbatas dibandingkan dengan serializer terbaru yang muncul dari orang-orang CompSci. Ada dua varian, pengkodean DER (biner) dan pengkodean PEM (ascii). Keduanya cepat, tetapi DER lebih cepat dan ukuran keduanya lebih efisien. Sebenarnya ASN.1 DER dapat dengan mudah mengikuti (dan terkadang mengalahkan) serializers yang dirancang selama 30 tahunsetelah itu sendiri, bukti desainnya yang direkayasa dengan baik. Ini sangat kompak, lebih kecil dari Protocol Buffer dan Thrift, hanya dikalahkan oleh Avro. Masalahnya adalah memiliki perpustakaan yang bagus untuk didukung dan saat ini Bouncy Castle tampaknya menjadi yang terbaik untuk C # / Java. ASN.1 adalah raja dalam keamanan dan sistem crypto dan tidak akan hilang, jadi jangan khawatir tentang 'pemeriksaan di masa depan'. Dapatkan perpustakaan yang bagus ...
MessagePack = tengah paket
Ini tidak buruk tetapi bukan yang tercepat, atau yang terkecil atau yang terbaik yang didukung. Tidak ada alasan produksi untuk memilihnya.
Umum
Di luar itu, mereka cukup mirip. Kebanyakan varian dari TLV: Type-Length-Value
prinsip dasar .
Protocol Buffer (berasal dari Google), Avro (berbasis Apache, digunakan di Hadoop), Thrift (berasal dari Facebook, sekarang proyek Apache) dan ASN.1 (berasal dari Telecom) semuanya melibatkan beberapa tingkat pembuatan kode di mana Anda pertama kali mengekspresikan data Anda dalam serializer format -specific, maka serializer "compiler" akan menghasilkan kode sumber untuk bahasa Anda melalui code-gen
fase. Sumber aplikasi Anda kemudian menggunakan code-gen
kelas ini untuk IO. Perhatikan bahwa implementasi tertentu (misalnya: perpustakaan Avro Microsoft atau ProtoBuf.NET Marc Gavel) memungkinkan Anda secara langsung menghias objek POCO / POJO tingkat aplikasi Anda dan kemudian perpustakaan secara langsung menggunakan kelas-kelas yang didekorasi itu alih-alih kelas-kelas gen kode. Kami telah melihat penawaran ini meningkatkan kinerja karena menghilangkan tahap penyalinan objek (dari bidang POCO / POJO tingkat aplikasi ke bidang kode-gen).
Beberapa hasil dan proyek langsung untuk dimainkan
Proyek ini ( https://github.com/sidshetye/SerializersCompare ) membandingkan pembuat serial penting di dunia C #. Orang-orang Java sudah memiliki sesuatu yang serupa .
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!)