MessagePack 使用

MessagePack(https://msgpack.org/) 是一个基于二进制高效的对象序列化 Library 用于跨语言通信。它可以像 JSON 那样,在许多种语言之间交换结构对象;但是它比 JSON 更快速也更轻巧。 支持 Python、Ruby、Java、C/C++、Javascript 等众多语言。 比 Google Protocol Buffers 还要快 4 倍。

MessagePack 特点:编解码高效,性能高;序列化之后的码流小。

快速入门:https://github.com/msgpack/msgpack-java

一、环境准备

<dependency>
<groupId>org.msgpack</groupId>
<artifactId>msgpack</artifactId>
<version>0.6.12</version>
</dependency>

二、MessagePack 使用

/**
* 关于Msgpack官网上是这么说的,It's like JSON.but fast and small
* 1.单个对象使用 Msgpack <BR />
* 1.1 此对象必须要实现 Serializable 接口(java.io.Serializable) <BR />
* 1.2 此对象必须要使用 @Message 注解(org.msgpack.annotation.Message) <BR />
* 1.3 此对象属性中不能有用 transient 修饰的字段. <BR />
* 2.序列化List,Map(List接口)直接这么做msgpack不支持.
* @author: leigang
* @version: 2018-04-28
*/
public class MsgpackTest { private long time;
private MessagePack msgpack; private UserBean user = new UserBean("binarylei", 22, true, 2000.0); @Before
public void beforeTest() {
time = System.currentTimeMillis();
msgpack = new MessagePack();
//msgpack.register(UserBean.class);
} @After
public void afterTest() {
msgpack.unregister();
System.out.println(System.currentTimeMillis() - time);
} //1. MessagePack 入门
@Test
public void test() throws IOException {
List<String> src = Arrays.asList(new String[]{"java", "python", "c"}); // Serialize
byte[] raw = msgpack.write(src); // Deserialize directly using a template
List<String> dst1 = msgpack.read(raw, Templates.tList(Templates.TString));
System.out.println(dst1); // Or, Deserialze to Value then convert type.
Value dynamic = msgpack.read(raw);
List<String> dst2 = new Converter(dynamic).read(Templates.tList(Templates.TString));
System.out.println(dst2);
} //2. JavaBean 对象序列化
@Test
public void testObject() throws IOException {
byte[] bytes = msgpack.write(user);
UserBean newValue = msgpack.read(bytes, UserBean.class);
Assert.assertEquals(user.getName(), newValue.getName());
} //3. JavaBean 包含 List,Map 属性,使用方式同上
@Test
public void testBean() throws IOException {
ListUserBean src = new ListUserBean();
List<UserBean> lst = new ArrayList<>();
lst.add(user);
src.setList(lst); byte[] bytes = msgpack.write(src);
ListUserBean dst1 = msgpack.read(bytes, ListUserBean.class);
System.out.println(dst1.getList());
} //4. List
@Test
public void testList() throws IOException {
List<UserBean> lst = new ArrayList<UserBean>();
for (int i = 0; i < 10; i++) {
lst.add(user);
} byte[] bytes = msgpack.write(lst);
List<UserBean> newValue = msgpack.read(bytes, Templates.tList(msgpack.lookup(UserBean.class)));
Assert.assertEquals(lst.size(), newValue.size());
} //5. Set
@Test
public void testSet() throws IOException {
Set<UserBean> set = new HashSet<UserBean>();
for (int i = 0; i < 10; i++) {
set.add(user);
} byte[] bytes = msgpack.write(set);
Set<UserBean> newValue = msgpack.read(bytes, Templates.tSet(msgpack.lookup(UserBean.class)));
Assert.assertEquals(set.size(), newValue.size());
} //6. Map
@Test
public void testMap() throws IOException {
Map<String, UserBean> map = new HashMap<>();
for (int i = 0; i < 10; i++) {
map.put(String.valueOf(i), user);
} byte[] bytes = msgpack.write(map);
Map<String, UserBean> newValue = msgpack.read(bytes,
Templates.tMap(Templates.TString, msgpack.lookup(UserBean.class)));
Assert.assertEquals(map.size(), newValue.size());
}
}

测试用的 bean 对象如下:

@Message
public class UserBean implements Serializable { private String name;
private int age;
private boolean sex;
private double salary; // 省略 getter/setter/constructor ...
} @Message
public class ListUserBean {
public List<UserBean> list; public List<UserBean> getList() {
return list;
} public void setList(List<UserBean> list) {
this.list = list;
}
}

三、踩过的坑

(1) 问题:Object 无法序列化

问题详见:https://github.com/msgpack/msgpack-java/issues/4

org.msgpack.MessageTypeException: Cannot find template for class java.lang.Object class. Try to add @message annotation to the class or call MessagePack.register(Type).
at org.msgpack.template.TemplateRegistry.lookup(TemplateRegistry.java:220)
at org.msgpack.template.TemplateRegistry.lookupGenericTypeImpl(TemplateRegistry.java:258)
at org.msgpack.template.TemplateRegistry.lookupGenericType(TemplateRegistry.java:230)
at org.msgpack.template.TemplateRegistry.lookup(TemplateRegistry.java:180)

如下 Map<String, Object> 中的 Object 出错,解决方法就是用具体的类代替 Object

@Message
public class Header implements Serializable {
// ...
//private Map<String, Object> attachmet = new HashMap<>();
private Map<String, String> attachmet = new HashMap<>();
}

参考:

  1. https://msgpack.org/
  2. https://github.com/msgpack/msgpack-java

每天用心记录一点点。内容也许不重要,但习惯很重要!

MessagePack 使用的更多相关文章

  1. 新型序列化类库MessagePack,比JSON更快、更小的格式

    MessagePack is an efficient binary serialization format. It lets you exchange data among multiple la ...

  2. MessagePack, Protocol Buffers和Thrift序列化框架原理和比较说明

    MessagePack, Protocol Buffers和Thrift序列化框架原理和比较说明 http://www.open-open.com/lib/view/open1412731170858 ...

  3. messagePack编解码

    首先引入javassist-3.20.0-GA.jar与msgpack-0.6.12.jar两个包,然后就可以使用. package com.ming.netty.code; import java. ...

  4. Android 数据传输之MessagePack使用

    介绍过什么是MessagePack之后,就进行Android与MessagePack的使用. 在MessagePack的官网上介绍MessagePack与Java结合使用的都是使用Maven作为JAR ...

  5. 计算机程序的思维逻辑 (63) - 实用序列化: JSON/XML/MessagePack

    上节,我们介绍了Java中的标准序列化机制,我们提到,它有一些重要的限制,最重要的是不能跨语言,实践中经常使用一些替代方案,比如XML/JSON/MessagePack. Java SDK中对这些格式 ...

  6. 基于.NET CORE微服务框架 -surging 基于messagepack、protobuffer、json.net 性能对比

    1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...

  7. 快速序列化组件MessagePack介绍

    简介 MessagePack for C#(MessagePack-CSharp)是用于C#的极速MessagePack序列化程序,比MsgPack-Cli快10倍,与其他所有C#序列化程序相比,具有 ...

  8. Messagepack原理

    什么是Messagepack? 用官方的话说:MessagePack是一种高效的二进制序列化格式.它允许您像JSON一样在多个语言之间交换数据.但是,它更快并且更小.小整数被编码为一个字节,和典型的短 ...

  9. MessagePack简析

    一.MessagePack是什么 先看官方的定义:MessagePack是一种高效的二进制序列化格式.它允许您像JSON一样在多个语言之间交换数据.但是,它更快并且更小. 从官方定义中,可以有如下的结 ...

  10. 基于.NET CORE微服务框架 -谈谈surging 的messagepack、protobuffer、json.net 序列化

    1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...

随机推荐

  1. selenium自动化测试遇到的问题积累--持续积累中

    引言: 在做UI自动化测试过程中,总是会遇到各种问题,而解决问题总是会花费一些时间和心思,但是解决后对于自己就是一种成长,持续积累,当可能遇到的问题都被你遇到过,并且都知道解决办法,这就是一种经验的价 ...

  2. 《汇编语言 基于x86处理器》前五章的小程序

    ▶ 书中前五章的几个小程序,基本的运算操作,使用了作者的库 Irvine32 和 Irvine64(一开始以为作者网站过期了,各网站上找到的文件大小都不一样,最后发现是要搭梯子 Orz,顺利下载).注 ...

  3. 5. Java中序列化的serialVersionUID作用

    Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象. 序列化是Java中实现持久化存储的一种方法:为数据传输提供了线路级对象表示法. Java的序列化机制是通过在运行时判断 ...

  4. JAVA SpringMVC + FormDate + Vue + file表单 ( 实现 js 单文件和多文件上传 )

    JS 部分 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <tit ...

  5. HTML5 Canvas ( 绘制一轮弯月, 星空中的弯月 )

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. J2SE 8的编译

    动态加载(修改)服务.高性动态业务逻辑实现(用脚本或模板引擎实现效率满足不了需求) package compile; import java.io.File; import java.io.IOExc ...

  7. 编写jQuery插件(三)——三个插件例子

    封装jQuery对象方法的插件 表格隔行变色插件 CSS部分: .even{ background:#CCC; } .odd{ background:#666; } .selected{ backgr ...

  8. 【转】Java自学之路——by马士兵

    作者:马士兵老师 JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟 ...

  9. StringUtil字符串工具类

    package com.zjx.test03; /** * 字符串工具类 * @author * */ public class StringUtil { /** * 判断是否是空 * @param ...

  10. (4)shiro多个realm

    shiro支持多个realm,当设置多个realm的时候,shiro的认证和授权的步骤是怎样的呢. 多个realm认证原理: 发现需要在执行认证的时候,需要策略来处理多个realm存在的情况.默认实现 ...