MessagePack 二进制序列化格式 开发入门详解
目录
MessagePack 概述
MessagePack 快速启动
MessagePack 概述
1、MessagePack 是一种高效的二进制序列化格式,它允许您在 JSON 等多种语言之间交换数据,但它更快速更小巧。小整数被编码为单个字节,典型的短字符串除了字符串本身之外只需要一个额外的字节。
2、MessagePack 官网地址:https://msgpack.org/
3、MessagePack Java 模块 GitHub 开源地址:https://github.com/msgpack/msgpack-java
4、MessagePack Java 文档地址:http://www.javadoc.io/doc/org.msgpack/msgpack-core/0.8.16
5、核心压缩方式可参看官方说明:https://github.com/msgpack/msgpack/blob/master/spec.md
6、MessagePack is supported by over 50 programming languages and environments.(MessagePack 支持主流的 50 多种编程语言)
Maven 依赖
1)可以进入 MessagePack 官网地址:https://msgpack.org/,然后选择 “Languages”(语言) 为第一个的 Java,然后右侧 “API” 中就会显示 MessagePack for Java 的 Maven 依赖,以及示例代码。
2)直接从 Maven 仓库中心获取:https://mvnrepository.com/artifact/org.msgpack/msgpack
Maven 仓库中心可以看到所有版本情况,如下所示这是最后一次 2015 更新的版本 0.6.12
<!-- https://mvnrepository.com/artifact/org.msgpack/msgpack -->
<dependency>
<groupId>org.msgpack</groupId>
<artifactId>msgpack</artifactId>
<version>0.6.12</version>
</dependency>
3)MessagePack Java 模块开发包自己依赖了 org.javassist 开发包,所示必须同时导入 msgpack 与 javassist 二进制包或者 Maven 依赖。
4)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>
5)org.javassist 二进制 Jar 包可以从 javassist 官网获取:http://www.javassist.org/。点击中间的 “ Download.zip” 即可下载,下载之后进行解压,找到里面的 “javassist.jar” 导入应用中即可。
6)Javassist 是一款字节码编辑工具,可以直接编辑和生成 Java 生成的字节码,以达到对 .class 文件进行动态修改的效果。
二进制 Jar 包获取
获取地址:链接:[https://pan.baidu.com/s/1-MzF\_bwHseIiXcLO2uLhUg][https_pan.baidu.com_s_1-MzF_bwHseIiXcLO2uLhUg] ,提取码:cnuz
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 +
'}';
}
}
还没有评论,来说两句吧...