非常好的说明文章,转自: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代码
- @MessagePackMessage
- public class Person {
- public int id;
- public String name;
- public double height;
- public Person() {
- }
@MessagePackMessage
public class Person {
public int id;
public String name;
public double height;
public Person() {
}
序列化直接调用MessagePack的pack方法;反序列化则调用对应的unpack方法。这两个方法,都支持传递序列化和反序列化的数据类型。
1.3 与json的序列化性能对比
如下所示,通过100条数据的序列化和反序列化进行对比。
Java代码
- List msgs = 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);
- }
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 |