一、MessagePack简介
MessagePack是更快,更小的数据传输格式,类似Json,支持多语言,比如Java ,C,C++ , 可以跨平台。比如可以用于Mqtt协议,在物联网和服务平台通讯中节省流量,提升效率。
二、Java两种加解包
方式一
数据格式
{
"address":{
"city":"广州",
"street":"万达广场"
},
"sex":"男",
"name":"张三",
"age":31
}
maven引入依赖包
<dependency>
<groupId>org.msgpack</groupId>
<artifactId>msgpack</artifactId>
<version>0.6.10</version>
</dependency>
数据压包
Map<String,Object> userInfo = new HashMap<>();
userInfo.put("name","张三");
userInfo.put("age",31);
userInfo.put("sex","男");
Map<String,String> addr = new HashMap<>();
addr.put("city","广州");
addr.put("street","万达广场");
userInfo.put("address",addr);
System.out.println(JSON.toJSONString(userInfo));
MessagePack messagePack = new MessagePack();
byte[] data = messagePack.write(userInfo);
System.out.println(HexUtils.byte2hexString(data));
输出十六进制
84A76164647265737382A463697479A6E5B9BFE5B79EA6737472656574ACE4B887E8BEB
EE5B9BFE59CBAA3736578A3E794B7A46E616D65A6E5BCA0E4B889A36167651F
前两位含义:数字8代表Map类型,4代表有4个值
解包代码
Map message = messagePack.read(data,
Templates.tMap(Templates.TString,Templates.TValue));
System.out.println(message);
//{name="张三", address={"city":"广州","street":"万达广场"}, age=31, sex="男"}
方式二
maven引入依赖包
<dependency>
<groupId>org.msgpack</groupId>
<artifactId>msgpack-core</artifactId>
<version>0.8.17</version>
</dependency>
方式2代码
MessageBufferPacker packer = MessagePack.newDefaultBufferPacker();
//数字类型
packer.packInt(32);
//字符类型
packer.packString("李四");
// arrays类型
int[] arr = new int[] {4, 8, 1, 0, -7, 23};
packer.packArrayHeader(arr.length);
for (int v : arr) {
packer.packInt(v);
}
// map类型
packer.packMapHeader(2);
packer.packString("age");
packer.packInt(1);
packer.packString("sex");
packer.packInt(2);
//字节数组类型
byte[] byteData = new byte[] {1, 2, 3, 4, 5, 6, 7};
packer.packBinaryHeader(byteData.length);
packer.writePayload(byteData );
System.out.println(HexUtils.byte2hexString(packer.toByteArray()));
//解包
MessageUnpacker unpacker =
MessagePack.newDefaultUnpacker(packer.toByteArray());
int age = unpacker.unpackInt();
System.out.println(id);
String name = unpacker.unpackString();
System.out.println(name);
int length = unpacker.unpackArrayHeader();
int[] array = new int[length];
for (int i = 0; i < length; ++i){
array[i]=unpacker.unpackInt();
}
System.out.println(Arrays.toString(array));
// 解析Map类型
int maplen = unpacker.unpackMapHeader();
for (int j = 0; j < maplen; j++) {
System.out.println(unpacker.unpackString());
System.out.println(unpacker.unpackInt());
}
//解析byte二进制类型
int binaryLen = unpacker.unpackBinaryHeader();
//按长度读取二进制数据
byte[] bytes = new byte[binaryLen];
unpacker.readPayload(bytes);
System.out.println(Arrays.toString(bytes));
packer.close();
总结
MessagePack的两种加解包方式可以灵活使用,第一种测试Map类型中有二进制类型,解析出来是乱码,可以通过第二种方式进行加解包解析。
通过jar中的丰富方法,可以灵活使用,是比Json更省流量的数据协议