java msgpack_MessagePack详解

MessagePack Intro

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.

它像 JSON,但是更快更小。

MessagePack 是一种高效的二进制序列化格式。它允许您在 JSON 等多种语言之间交换数据,但它更快速更小巧。小整数被编码为单个字节,典型的短字符串除了字符串本身之外只需要一个额外的字节。

MessagePack is supported by over 50 programming languages and environments.(MessagePack 支持主流的 50 多种编程语言)

Maven 依赖

msgpack

1)可以进入 MessagePack 官网地址:https://msgpack.org/,然后选择 “Languages”(语言) 为第一个的 Java,然后右侧 “API” 中就会显示 MessagePack for Java 的 Maven 依赖,以及示例代码。

Maven 仓库中心可以看到所有版本情况,如下所示这是最后一次 2015 更新的版本 0.6.12

org.msgpack

msgpack

0.6.12

avassist

MessagePack Java 模块开发包自己依赖了 org.javassist 开发包,所示必须同时导入 msgpack 与 javassist 二进制包或者 Maven 依赖。

org.javassist

javassist

3.24.0-GA

org.javassist 二进制 Jar 包可以从 javassist 官网获取:http://www.javassist.org/。点击中间的 “ Download.zip” 即可下载,下载之后进行解压,找到里面的 "javassist.jar" 导入应用中即可。

Javassist 是一款字节码编辑工具,可以直接编辑和生成 Java 生成的字节码,以达到对 .class 文件进行动态修改的效果。

二进制 Jar 包获取

2971099a12fb95090a3acb5615e1a18c.png

编码示例

package com.lct.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 read(byte[] bytes, Template tmpl)

* 根据模板将对象反序列化为对象,同一个 API 解决

* 这个模板就是制定序列化的数据类型

*/

String dst1 = messagePack.read(raw, Templates.TString);

System.out.println(dst1);//输出:{"pId":9527,"pName":"华安","isMarry":true}

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* 序列化与反序列化 List

*/

public static void serializesStringList(){

try {

/** 创建序列化对象

* 提示:序列化是针对对象操作的

* */

List src = new ArrayList();

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 read(byte[] bytes, Template tmpl)

* 根据模板将对象反序列化为对象

* 这个模板就是制定序列化的数据类型

*/

List 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 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 +

'}';

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/v1/object.hpp:664:34: error: ‘void* memcpy(void*, const void*, size_t)’ copying an object of non-trivial type ‘struct msgpack::v2::object’ from an array of ‘const msgpack_object’ {aka ‘const struct msgpack_object’} [-Werror=class-memaccess] std::memcpy(&o, &v, sizeof(v)); ^ In file included from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/object_fwd.hpp:17, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/v1/adaptor/adaptor_base_decl.hpp:14, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/adaptor/adaptor_base_decl.hpp:13, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/adaptor/adaptor_base.hpp:13, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/v1/object_decl.hpp:16, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/object_decl.hpp:14, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/object.hpp:13, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack.hpp:10, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/example/cpp03/stream.cpp:10: /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/v2/object_fwd.hpp:23:8: note: ‘struct msgpack::v2::object’ declared here struct object : v1::object { ^~~~~~ cc1plus: all warnings being treated as errors make[2]: *** [example/cpp03/CMakeFiles/stream.dir/build.make:63:example/cpp03/CMakeFiles/stream.dir/stream.cpp.o] 错误 1 make[2]: 离开目录“/home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master” make[1]: *** [CMakeFiles/Makefile2:415:example/cpp03/CMakeFiles/stream.dir/all] 错误 2 make[1]: 离开目录“/home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master”
07-20

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值