MessagePack 介绍
It’s like JSON.but fast and small.
MessagePack is an efficient binary serialization format. It lets you exchange data among multiple languages like JSON. But it’s faster and smaller. Small integers are encoded into a single byte, and typical short strings require only one extra byte in addition to the strings themselves.
MessagePack 官网地址:https://msgpack.org/
MessagePack Java 模块 GitHub 开源地址:https://github.com/msgpack/msgpack-java
MessagePack Java 文档地址:http://www.javadoc.io/doc/org.msgpack/msgpack-core/0.8.16
核心压缩方式可参看官方说明:https://github.com/msgpack/msgpack/blob/master/spec.md
MessagePack is supported by over 50 programming languages and environments.(MessagePack 支持主流的 50 多种编程语言)
Maven 依赖
直接从 Maven 仓库中心获取,地址:https://mvnrepository.com/artifact/org.msgpack/msgpack
<!-- https://mvnrepository.com/artifact/org.msgpack/msgpack -->
<dependency>
<groupId>org.msgpack</groupId>
<artifactId>msgpack</artifactId>
<version>0.6.12</version>
</dependency>
avassist
MessagePack Java 模块开发包自己依赖了 org.javassist 开发包,所示必须同时导入 msgpack 与 javassist 二进制包或者 Maven 依赖。
org.javassist Maven 依赖可以从 Maven 中央仓库获取:https://mvnrepository.com/artifact/org.javassist/javassist
<!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.24.0-GA</version>
</dependency>
编码实例
package com.viagra.demo.messagepack;
import org.msgpack.MessagePack;
import org.msgpack.annotation.Message;
import org.msgpack.template.Templates;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* Created by Administrator on 2018/11/25 0025.
*/
public class MessageTest {
/**
* 序列化与反序列化 String
*/
public static void serializesString() {
try {
/** 创建序列化对象。提示:序列化是针对对象操作的
* */
String userInfo = "{\"pId\":9527,\"pName\":\"华安\",\"isMarry\":true}";
/** org.msgpack.MessagePack 是 java 开发的基本类
* 用于创建序列化器与反序列化器*/
MessagePack messagePack = new MessagePack();
/**序列化指定的对象为字节数组
* 提示:这个字节数组与 java.lang.String#getBytes() 返回的字节数组是不一样的
* 使用 String(byte bytes[]) 相应返回是得不到正常结果的
* 只能再通过 MessagePack 进行反序列化得到结果*/
byte[] raw = messagePack.write(userInfo);
/**
* <T> T read(byte[] bytes, Template<T> tmpl)
* 根据模板将对象反序列化为对象,同一个 API 解决
* 这个模板就是制定序列化的数据类型
*/
String dst1 = messagePack.read(raw, Templates.TString);
System.out.println(dst1);//输出:{"pId":9527,"pName":"华安","isMarry":true}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 序列化与反序列化 List<String>
*/
public static void serializesStringList() {
try {
/** 创建序列化对象
* 提示:序列化是针对对象操作的
* */
List<String> src = new ArrayList<String>();
src.add("Java");
src.add("IOS");
src.add("Android");
/** org.msgpack.MessagePack 是 java 开发的基本类
* 用于创建序列化器与反序列化器
*/
MessagePack messagePack = new MessagePack();
/**序列化指定的对象为字节数组——————整个序列化过程就是如此简单,一个 API 解决
* 提示:这个字节数组与 java.lang.String#getBytes() 返回的字节数组是不一样的
* 使用 String(byte bytes[]) 相应返回是得不到正常结果的
* 只能再通过 MessagePack 进行反序列化得到结果*/
byte[] raw = messagePack.write(src);
/**
* <T> T read(byte[] bytes, Template<T> tmpl)
* 根据模板将对象反序列化为对象
* 这个模板就是制定序列化的数据类型
*/
List<String> dst1 = messagePack.read(raw, Templates.tList(Templates.TString));
System.out.println(dst1.get(0));//输出:Java
System.out.println(dst1.get(1));//输出:IOS
System.out.println(dst1.get(2));//输出:Android
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 序列化与反序列化 POJO
* 注意:需要序列化的 POJO 对象上必须加上 org.msgpack.annotation.Message 注解:@Message
*/
public static void serializesPOJO() {
try {
/** 创建序列化对象。提示:序列化是针对对象操作的
* User 类上必须加上 @Message 注解
* */
User user = new User();
user.setpId(9527);
user.setpName("华安");
/** org.msgpack.MessagePack 是 java 开发的基本类
* 用于创建序列化器与反序列化器
*/
MessagePack messagePack = new MessagePack();
/**序列化指定的对象为字节数组——————整个序列化过程就是如此简单,一个 API 解决
* 提示:这个字节数组与 java.lang.String#getBytes() 返回的字节数组是不一样的
* 使用 String(byte bytes[]) 相应返回是得不到正常结果的
* 只能再通过 MessagePack 进行反序列化得到结果*/
byte[] raw = messagePack.write(user);
/** read(byte[] bytes, Class<T> c)
* 将字节数组反序列化为指定类对象,c 指定 POJO 类即可
*/
User userFinal = messagePack.read(raw, User.class);
System.out.println(userFinal);
//输出:User{birthday=null, pId=9527, pName='华安', isMarry=null}
System.out.println(userFinal.getpId() + "," + userFinal.getpName());
//输出:9527,华安
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
serializesPOJO();
}
}
/**
* 用户
* 注意:需要序列化的 POJO 对象上必须加上 org.msgpack.annotation.Message 注解:@Message
*/
@Message
class User {
private Integer pId;
private String pName;
private Date birthday;
private Boolean isMarry;
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public boolean isMarry() {
return isMarry;
}
public void setIsMarry(boolean isMarry) {
this.isMarry = isMarry;
}
public Integer getpId() {
return pId;
}
public void setpId(Integer pId) {
this.pId = pId;
}
public String getpName() {
return pName;
}
public void setpName(String pName) {
this.pName = pName;
}
public Boolean getIsMarry() {
return isMarry;
}
public void setIsMarry(Boolean isMarry) {
this.isMarry = isMarry;
}
@Override
public String toString() {
return "User{" +
"birthday=" + birthday +
", pId=" + pId +
", pName='" + pName + '\'' +
", isMarry=" + isMarry +
'}';
}
}