Chúng tôi vừa thực hiện một nghiên cứu nội bộ về serial serial, đây là một số kết quả (để tôi tham khảo trong tương lai!)
Thrift = tuần tự hóa + ngăn xếp RPC
Sự khác biệt lớn nhất là Thrift không chỉ là một giao thức tuần tự hóa, nó là một ngăn xếp RPC hoàn toàn giống như một ngăn xếp SOAP hiện đại. Vì vậy, sau khi tuần tự hóa, các đối tượng có thể (nhưng không bắt buộc) được gửi giữa các máy qua TCP / IP. Trong SOAP, bạn đã bắt đầu với một tài liệu WSDL mô tả đầy đủ các dịch vụ có sẵn (phương thức từ xa) và các đối số / đối tượng dự kiến. Những đối tượng đó đã được gửi qua XML. Trong Thrift, tệp .thrift mô tả đầy đủ các phương thức có sẵn, các đối tượng tham số dự kiến và các đối tượng được tuần tự hóa thông qua một trong các trình tuần tự hóa có sẵn (với Compact Protocol
, một giao thức nhị phân hiệu quả, phổ biến nhất trong sản xuất).
ASN.1 = Ông nội
ASN.1 được thiết kế bởi những người viễn thông trong thập niên 80 và rất khó sử dụng do sự hỗ trợ của thư viện hạn chế so với các bộ nối tiếp gần đây xuất hiện từ những người CompSci. Có hai biến thể, mã hóa DER (nhị phân) và mã hóa PEM (ascii). Cả hai đều nhanh, nhưng DER nhanh hơn và hiệu quả hơn về kích thước của cả hai. Trong thực tế, ASN.1 DER có thể dễ dàng theo kịp (và đôi khi đánh bại) các bộ nối tiếp được thiết kế 30 nămsau đó, một minh chứng cho thiết kế kỹ thuật tốt của nó. Nó rất nhỏ gọn, nhỏ hơn so với Giao thức đệm và tiết kiệm, chỉ bị Avro đánh bại. Vấn đề là có các thư viện tuyệt vời để hỗ trợ và ngay bây giờ Bouncy Castle dường như là thư viện tốt nhất cho C # / Java. ASN.1 là vua trong các hệ thống bảo mật và tiền điện tử và sẽ không biến mất, vì vậy đừng lo lắng về 'bằng chứng trong tương lai'. Chỉ cần có một thư viện tốt ...
MessagePack = giữa gói
Nó không tệ nhưng nó không phải là nhanh nhất, cũng không phải nhỏ nhất cũng không được hỗ trợ tốt nhất. Không có lý do sản xuất để chọn nó.
Chung
Ngoài ra, chúng khá giống nhau. Hầu hết là các biến thể của TLV: Type-Length-Value
nguyên tắc cơ bản .
Bộ đệm giao thức (có nguồn gốc từ Google), Avro (dựa trên Apache, được sử dụng trong Hadoop), Thrift (có nguồn gốc từ Facebook, hiện là dự án Apache) và ASN.1 (có nguồn gốc từ viễn thông) đều liên quan đến một số cấp độ tạo mã trong đó bạn lần đầu tiên thể hiện dữ liệu của mình trong trình tuần tự hóa định dạng cụ thể, sau đó trình biên dịch "trình biên dịch" sẽ tạo mã nguồn cho ngôn ngữ của bạn thông qua code-gen
pha. Nguồn ứng dụng của bạn sau đó sử dụng các code-gen
lớp này cho IO. Lưu ý rằng một số triển khai nhất định (ví dụ: thư viện Avro của Microsoft hoặc ProtoBuf.NET của Marc Gavel) cho phép bạn trực tiếp trang trí các đối tượng POCO / POJO cấp ứng dụng của mình và sau đó thư viện sử dụng trực tiếp các lớp được trang trí đó thay vì bất kỳ lớp mã gen nào. Chúng tôi đã thấy điều này mang lại hiệu suất tăng cường vì nó loại bỏ giai đoạn sao chép đối tượng (từ các trường POCO / POJO cấp ứng dụng sang các trường mã-gen).
Một số kết quả và một dự án trực tiếp để chơi với
Dự án này ( https://github.com/sidshetye/SerialulatorsCompare ) so sánh các serial serial quan trọng trong thế giới C #. Những người Java đã có một cái gì đó tương tự .
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!)