MessagePack 二进制序列化格式 开发入门详解

清疚 2022-04-14 05:51 203阅读 0赞

目录

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

  1. Maven 仓库中心可以看到所有版本情况,如下所示这是最后一次 2015 更新的版本 0.6.12
  2. <!-- https://mvnrepository.com/artifact/org.msgpack/msgpack -->
  3. <dependency>
  4. <groupId>org.msgpack</groupId>
  5. <artifactId>msgpack</artifactId>
  6. <version>0.6.12</version>
  7. </dependency>

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

4)org.javassist Maven 依赖可以从 Maven 中央仓库获取:https://mvnrepository.com/artifact/org.javassist/javassist

  1. <!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
  2. <dependency>
  3. <groupId>org.javassist</groupId>
  4. <artifactId>javassist</artifactId>
  5. <version>3.24.0-GA</version>
  6. </dependency>

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

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

二进制 Jar 包获取

  1. 获取地址:链接:[https://pan.baidu.com/s/1-MzF\_bwHseIiXcLO2uLhUg][https_pan.baidu.com_s_1-MzF_bwHseIiXcLO2uLhUg] ,提取码:cnuz

20181125123015262.png

MessagePack 快速启动

  1. import org.msgpack.MessagePack;
  2. import org.msgpack.annotation.Message;
  3. import org.msgpack.template.Templates;
  4. import java.io.IOException;
  5. import java.util.ArrayList;
  6. import java.util.Date;
  7. import java.util.List;
  8. /**
  9. * Created by Administrator on 2018/11/25 0025.
  10. */
  11. public class MessageTest {
  12. /**
  13. * 序列化与反序列化 String
  14. */
  15. public static void serializesString() {
  16. try {
  17. /** 创建序列化对象。提示:序列化是针对对象操作的
  18. * */
  19. String userInfo = "{\"pId\":9527,\"pName\":\"华安\",\"isMarry\":true}";
  20. /** org.msgpack.MessagePack 是 java 开发的基本类
  21. * 用于创建序列化器与反序列化器*/
  22. MessagePack messagePack = new MessagePack();
  23. /**序列化指定的对象为字节数组
  24. * 提示:这个字节数组与 java.lang.String#getBytes() 返回的字节数组是不一样的
  25. * 使用 String(byte bytes[]) 相应返回是得不到正常结果的
  26. * 只能再通过 MessagePack 进行反序列化得到结果*/
  27. byte[] raw = messagePack.write(userInfo);
  28. /**
  29. * <T> T read(byte[] bytes, Template<T> tmpl)
  30. * 根据模板将对象反序列化为对象,同一个 API 解决
  31. * 这个模板就是制定序列化的数据类型
  32. */
  33. String dst1 = messagePack.read(raw, Templates.TString);
  34. System.out.println(dst1);//输出:{"pId":9527,"pName":"华安","isMarry":true}
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. /**
  40. * 序列化与反序列化 List<String>
  41. */
  42. public static void serializesStringList() {
  43. try {
  44. /** 创建序列化对象
  45. * 提示:序列化是针对对象操作的
  46. * */
  47. List<String> src = new ArrayList<String>();
  48. src.add("Java");
  49. src.add("IOS");
  50. src.add("Android");
  51. /** org.msgpack.MessagePack 是 java 开发的基本类
  52. * 用于创建序列化器与反序列化器
  53. */
  54. MessagePack messagePack = new MessagePack();
  55. /**序列化指定的对象为字节数组——————整个序列化过程就是如此简单,一个 API 解决
  56. * 提示:这个字节数组与 java.lang.String#getBytes() 返回的字节数组是不一样的
  57. * 使用 String(byte bytes[]) 相应返回是得不到正常结果的
  58. * 只能再通过 MessagePack 进行反序列化得到结果*/
  59. byte[] raw = messagePack.write(src);
  60. /**
  61. * <T> T read(byte[] bytes, Template<T> tmpl)
  62. * 根据模板将对象反序列化为对象
  63. * 这个模板就是制定序列化的数据类型
  64. */
  65. List<String> dst1 = messagePack.read(raw, Templates.tList(Templates.TString));
  66. System.out.println(dst1.get(0));//输出:Java
  67. System.out.println(dst1.get(1));//输出:IOS
  68. System.out.println(dst1.get(2));//输出:Android
  69. } catch (IOException e) {
  70. e.printStackTrace();
  71. }
  72. }
  73. /**
  74. * 序列化与反序列化 POJO
  75. * 注意:需要序列化的 POJO 对象上必须加上 org.msgpack.annotation.Message 注解:@Message
  76. */
  77. public static void serializesPOJO() {
  78. try {
  79. /** 创建序列化对象。提示:序列化是针对对象操作的
  80. * User 类上必须加上 @Message 注解
  81. * */
  82. User user = new User();
  83. user.setpId(9527);
  84. user.setpName("华安");
  85. /** org.msgpack.MessagePack 是 java 开发的基本类
  86. * 用于创建序列化器与反序列化器
  87. */
  88. MessagePack messagePack = new MessagePack();
  89. /**序列化指定的对象为字节数组——————整个序列化过程就是如此简单,一个 API 解决
  90. * 提示:这个字节数组与 java.lang.String#getBytes() 返回的字节数组是不一样的
  91. * 使用 String(byte bytes[]) 相应返回是得不到正常结果的
  92. * 只能再通过 MessagePack 进行反序列化得到结果*/
  93. byte[] raw = messagePack.write(user);
  94. /** read(byte[] bytes, Class<T> c)
  95. * 将字节数组反序列化为指定类对象,c 指定 POJO 类即可
  96. */
  97. User userFinal = messagePack.read(raw, User.class);
  98. System.out.println(userFinal);
  99. //输出:User{birthday=null, pId=9527, pName='华安', isMarry=null}
  100. System.out.println(userFinal.getpId() + "," + userFinal.getpName());
  101. //输出:9527,华安
  102. } catch (IOException e) {
  103. e.printStackTrace();
  104. }
  105. }
  106. public static void main(String[] args) {
  107. serializesPOJO();
  108. }
  109. }
  110. /**
  111. * 用户
  112. * 注意:需要序列化的 POJO 对象上必须加上 org.msgpack.annotation.Message 注解:@Message
  113. */
  114. @Message
  115. class User {
  116. private Integer pId;
  117. private String pName;
  118. private Date birthday;
  119. private Boolean isMarry;
  120. public Date getBirthday() {
  121. return birthday;
  122. }
  123. public void setBirthday(Date birthday) {
  124. this.birthday = birthday;
  125. }
  126. public boolean isMarry() {
  127. return isMarry;
  128. }
  129. public void setIsMarry(boolean isMarry) {
  130. this.isMarry = isMarry;
  131. }
  132. public Integer getpId() {
  133. return pId;
  134. }
  135. public void setpId(Integer pId) {
  136. this.pId = pId;
  137. }
  138. public String getpName() {
  139. return pName;
  140. }
  141. public void setpName(String pName) {
  142. this.pName = pName;
  143. }
  144. public Boolean getIsMarry() {
  145. return isMarry;
  146. }
  147. public void setIsMarry(Boolean isMarry) {
  148. this.isMarry = isMarry;
  149. }
  150. @Override
  151. public String toString() {
  152. return "User{" +
  153. "birthday=" + birthday +
  154. ", pId=" + pId +
  155. ", pName='" + pName + '\'' +
  156. ", isMarry=" + isMarry +
  157. '}';
  158. }
  159. }

发表评论

表情:
评论列表 (有 0 条评论,203人围观)

还没有评论,来说两句吧...

相关阅读