java messagepack_MessagePack解析实例Java

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值