当前位置: 首页 > 工具软件 > MessagePack > 使用案例 >

java messagepack_MessagePack解析实例Java

叶裕
2023-12-01

一、MessagePack简介

MessagePack是更快,更小的数据传输格式,类似Json,支持多语言,比如Java ,C,C++ , 可以跨平台。比如可以用于Mqtt协议,在物联网和服务平台通讯中节省流量,提升效率。

二、Java两种加解包

方式一

数据格式

{

"address":{

"city":"广州",

"street":"万达广场"

},

"sex":"男",

"name":"张三",

"age":31

}

maven引入依赖包

org.msgpack

msgpack

0.6.10

数据压包

Map userInfo = new HashMap<>();

userInfo.put("name","张三");

userInfo.put("age",31);

userInfo.put("sex","男");

Map 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引入依赖包

org.msgpack

msgpack-core

0.8.17

方式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更省流量的数据协议

 类似资料: