【协议】MessagePack, Protocol Buffers和Thrift序列化框架原理和比较说明

本文详细介绍了MessagePack、Protocol Buffers和Thrift三种序列化框架的消息编码、序列化与反序列化方式,并进行了性能对比。MessagePack在反序列化速度上有优势,Protocol Buffers在字节流和时间上表现优秀,Thrift提供了多种协议和传输方式,适用于跨语言通信。
摘要由CSDN通过智能技术生成
非常好的说明文章,转自:http://jimmee.iteye.com/blog/2042420
第1部分 messagepack说明

1.1messagepack的消息编码说明

为什么messagepack比json序列化使用的字节流更少, 可通过图1-1、图1-2有个直观的感觉。

 

图1- 1 messagepack与json的格式对比1

图1- 2 messagepack与json的格式对比2

messagepack的具体的消息格式如图1-3所示,messagepack的数据类型主要分类两类:固定长度类型和可变长度类型。

图1- 3 messagepack的消息格式

messagepack的具体类型信息表示如图1-4所示。

 

图1- 4 messagepack的类型信息

1.2 messagepack的序列化和反序列化方式

现在msgpack能支持基本的数据类型,支持list和map, 还支持自定义的数据类型。例子1, 序列化和反序列化一个javabean, 只要加上@MessagePackMessage的注解。

Java代码  
收藏代码
【协议】MessagePack, <wbr>Protocol <wbr>Buffers和Thrift序列化框架原理和比较说明
  1.   
  2. @MessagePackMessage   
  3. public class Person {  
  4.   
  5. public int id;  
  6.   
  7. public String name;  
  8.   
  9. public double height;  
  10.   
  11. public Person() {  
  12. }  
@MessagePackMessage 
public class Person {

public int id;

public String name;

public double height;

public Person() {
}

序列化直接调用MessagePack的pack方法;反序列化则调用对应的unpack方法。这两个方法,都支持传递序列化和反序列化的数据类型。

1.3 与json的序列化性能对比

如下所示,通过100条数据的序列化和反序列化进行对比。

Java代码  
收藏代码
【协议】MessagePack, <wbr>Protocol <wbr>Buffers和Thrift序列化框架原理和比较说明
  1. List msgs = new ArrayList();  
  2. for (int i = 0; i < 100; i++) {  
  3. Map msg = new HashMap();  
  4. msg.put(Const.FID, i);  
  5. msg.put(Const.SUBJECT, "subject" + i);  
  6. msg.put(Const.LABEL0, 1);  
  7. msg.put(Const.FROM, "test@163.com");  
  8. msg.put(Const.TO, "test@126.com");  
  9. msg.put(Const.MODIFIED_DATE, new Date().getTime());  
  10. msg.put(Const.RECEIVED_DATE, new Date().getTime());  
  11. msg.put(Const.SENT_DATE, new Date().getTime());  
  12. msgs.add(msg);  
  13.     }  
Listmsgs = new ArrayList(); for (int i = 0; i < 100; i++) { Map msg = new HashMap(); msg.put(Const.FID, i); msg.put(Const.SUBJECT, "subject" + i); msg.put(Const.LABEL0, 1); msg.put(Const.FROM, "test@163.com"); msg.put(Const.TO, "test@126.com"); msg.put(Const.MODIFIED_DATE, new Date().getTime()); msg.put(Const.RECEIVED_DATE, new Date().getTime()); msg.put(Const.SENT_DATE, new Date().getTime()); msgs.add(msg); }

比较结果如表1-1所示。

表1- 1 messagepack与json的性能对比

框架

字节大小(byte)

序列化时间(ns)

反序列化时间(ns)

messagepack

12793

2313335

529458

json

17181

 1338371

177651

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值