版权声明:分享是一种品质,开源是一种精神。 https://blog.csdn.net/wangmx1993328/article/details/84477073

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 官网地址:https://msgpack.org/

MessagePack Java 模块 GitHub 开源地址:https://github.com/msgpack/msgpack-java

MessagePack Java 文档地址:http://www.javadoc.io/doc/org.msgpack/msgpack-core/0.8.16

核心压缩方式可参看官方说明:https://github.com/msgpack/msgpack/blob/master/spec.md

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 依赖,以及示例代码。

2)直接从 Maven 仓库中心获取:https://mvnrepository.com/artifact/org.msgpack/msgpack

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

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

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

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>
     

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

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

二进制 Jar 包获取

获取地址:链接:https://pan.baidu.com/s/1-MzF_bwHseIiXcLO2uLhUg ,提取码:cnuz

编码示例

  1.  package com.lct.messagepack;
     
  2.  
  3.  import org.msgpack.MessagePack;
     
  4.  import org.msgpack.annotation.Message;
     
  5.  import org.msgpack.template.Templates;
     
  6.  
  7.  import java.io.IOException;
     
  8.  import java.util.ArrayList;
     
  9.  import java.util.Date;
     
  10.  import java.util.List;
     
  11.  
  12.  /**
     
  13. * Created by Administrator on 2018/11/25 0025.
     
  14.  */
     
  15.  public class MessageTest {
     
  16.  

    /**

  17.  * 序列化与反序列化 String
     
  18.  */
     
  19.  public static void serializesString() {
     
  20.  try {
     
  21.  /** 创建序列化对象。提示:序列化是针对对象操作的
     
  22.  * */
     
  23.  String userInfo = "{\"pId\":9527,\"pName\":\"华安\",\"isMarry\":true}";
     
  24.  
  25.  /** org.msgpack.MessagePack 是 java 开发的基本类
     
  26.  * 用于创建序列化器与反序列化器*/
     
  27.  MessagePack messagePack = new MessagePack();
     
  28.  
  29.  /**序列化指定的对象为字节数组
     
  30.  * 提示:这个字节数组与 java.lang.String#getBytes() 返回的字节数组是不一样的
     
  31.  * 使用 String(byte bytes[]) 相应返回是得不到正常结果的
     
  32.  * 只能再通过 MessagePack 进行反序列化得到结果*/
     
  33.  byte[] raw = messagePack.write(userInfo);
     
  34.  
  35.  /**
     
  36.  * <T> T read(byte[] bytes, Template<T> tmpl)
     
  37.  * 根据模板将对象反序列化为对象,同一个 API 解决
     
  38.  * 这个模板就是制定序列化的数据类型
     
  39.  */
     
  40.  String dst1 = messagePack.read(raw, Templates.TString);
     
  41.  System.out.println(dst1);//输出:{"pId":9527,"pName":"华安","isMarry":true}
     
  42.  } catch (IOException e) {
     
  43.  e.printStackTrace();
     
  44.  }
     
  45.  }
     
  46.  
  47.  /**
     
  48.  * 序列化与反序列化 List<String>
     
  49.  */
     
  50.  public static void serializesStringList() {
     
  51.  try {
     
  52.  /** 创建序列化对象
     
  53.  * 提示:序列化是针对对象操作的
     
  54.  * */
     
  55.  List<String> src = new ArrayList<String>();
     
  56.  src.add("Java");
     
  57.  src.add("IOS");
     
  58.  src.add("Android");
     
  59.  
  60.  /** org.msgpack.MessagePack 是 java 开发的基本类
     
  61.  * 用于创建序列化器与反序列化器
     
  62.  */
     
  63.  MessagePack messagePack = new MessagePack();
     
  64.  
  65.  /**序列化指定的对象为字节数组——————整个序列化过程就是如此简单,一个 API 解决
     
  66.  * 提示:这个字节数组与 java.lang.String#getBytes() 返回的字节数组是不一样的
     
  67. * 使用 String(byte bytes[]) 相应返回是得不到正常结果的
  68.  * 只能再通过 MessagePack 进行反序列化得到结果*/
     
  69.  byte[] raw = messagePack.write(src);
     
  70.  
  71.  /**
     
  72.  * <T> T read(byte[] bytes, Template<T> tmpl)
     
  73.  * 根据模板将对象反序列化为对象
     
  74.  * 这个模板就是制定序列化的数据类型
     
  75.  */
     
  76.  List<String> dst1 = messagePack.read(raw, Templates.tList(Templates.TString));
     
  77.  System.out.println(dst1.get(0));//输出:Java
     
  78.  System.out.println(dst1.get(1));//输出:IOS
     
  79.  System.out.println(dst1.get(2));//输出:Android
     
  80.  
  81.  } catch (IOException e) {
     
  82.  e.printStackTrace();
     
  83.  }
     
  84.  }
     
  85.  
  86.  /**
     
  87.  * 序列化与反序列化 POJO
     
  88.  * 注意:需要序列化的 POJO 对象上必须加上 org.msgpack.annotation.Message 注解:@Message
     
  89.  */
     
  90.  public static void serializesPOJO() {
     
  91.  try {
     
  92.  /** 创建序列化对象。提示:序列化是针对对象操作的
     
  93.  * User 类上必须加上 @Message 注解
     
  94.  * */
     
  95.  User user = new User();
     
  96.  user.setpId(9527);
     
  97.  user.setpName("华安");
     
  98.  
  99.  /** org.msgpack.MessagePack 是 java 开发的基本类
     
  100.  * 用于创建序列化器与反序列化器
     
  101.  */
     
  102.  MessagePack messagePack = new MessagePack();
     
  103.  
  104.  /**序列化指定的对象为字节数组——————整个序列化过程就是如此简单,一个 API 解决
     
  105.  * 提示:这个字节数组与 java.lang.String#getBytes() 返回的字节数组是不一样的
     
  106.  * 使用 String(byte bytes[]) 相应返回是得不到正常结果的
     
  107.  * 只能再通过 MessagePack 进行反序列化得到结果*/
     
  108.  byte[] raw = messagePack.write(user);
     
  109.  
  110.  /** read(byte[] bytes, Class<T> c)
     
  111.  * 将字节数组反序列化为指定类对象,c 指定 POJO 类即可
     
  112.  */
     

    User userFinal = messagePack.read(raw, User.class)

  113. System.out.println(userFinal);
  114.  
  115.  //输出:User{birthday=null, pId=9527, pName='华安', isMarry=null}
     
  116.  System.out.println(userFinal.getpId() + "," + userFinal.getpName());
     
  117.  //输出:9527,华安
     
  118.  } catch (IOException e) {
     
  119.  e.printStackTrace();
     
  120.  }
     
  121.  }
     
  122. public static void main(String[] args) {
  123.  serializesPOJO();
     
  124.  }
     
  125.  }
  126.  
  127.  /**
     
  128.  * 用户
     
  129.  * 注意:需要序列化的 POJO 对象上必须加上 org.msgpack.annotation.Message 注解:@Message
     
  130.  */
     
  131.  
    @Message
  132.  
    class User {
  133.  
    private Integer pId;
  134.  
    private String pName;
  135.  
    private Date birthday;
  136.  
    private Boolean isMarry;
  137.  
     
  138.  
    public Date getBirthday() {
  139.  
    return birthday;
  140.  
    }
  141.  
     
  142.  
    public void setBirthday(Date birthday) {
  143.  
    this.birthday = birthday;
  144.  
    }
  145.  
     
  146.  
    public boolean isMarry() {
  147.  
    return isMarry;
  148.  
    }
  149.  
     
  150.  
    public void setIsMarry(boolean isMarry) {
  151.  
    this.isMarry = isMarry;
  152.  
    }
  153.  
     
  154.  
    public Integer getpId() {
  155.  
    return pId;
  156.  
    }
  157.  
     
  158.  
    public void setpId(Integer pId) {
  159.  
    this.pId = pId;
  160.  
    }
  161.  
     
  162.  
    public String getpName() {
  163.  
    return pName;
  164.  
    }
  165.  
     
  166.  
    public void setpName(String pName) {
  167.  
    this.pName = pName;
  168.  
    }
  169.  
     
  170.  
    public Boolean getIsMarry() {
  171.  
    return isMarry;
  172.  
    }
  173.  
     
  174.  
    public void setIsMarry(Boolean isMarry) {
  175.  
    this.isMarry = isMarry;
  176.  
    }
  177.  
     
  178.  
    @Override
  179.  
    public String toString() {
  180.  
    return "User{" +
  181.  
    "birthday=" + birthday +
  182.  
    ", pId=" + pId +
  183.  
    ", pName='" + pName + '\'' +
  184.  
    ", isMarry=" + isMarry +
  185.  
    '}';
  186.  
    }
  187.  
    }

MessagePack详解的更多相关文章

  1. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  2. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  3. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  4. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  5. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  6. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  7. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  8. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  9. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

随机推荐

  1. Linux性能优化实战学习笔记:第三十九讲

    一.上节回顾 上一节,我带你学习了 tcpdump 和 Wireshark 的使用方法,并通过几个案例,带你用这两个工具实际分析了网络的收发过程.碰到网络性能问题,不要忘记可以用 tcpdump 和W ...

  2. Visual Studio 调试系列9 调试器提示和技巧

    系列目录     [已更新最新开发文章,点击查看详细] 01 固定数据提示 如果你在调试时,经常将鼠标悬停在数据提示上,就可能想固定变量的数据提示,方便自己随时查看. 即使在重新启动后,固定的变量也能 ...

  3. Python处理数据集-1

    原数据集的数据格式: 每行为:(test_User, test_Item) negativeItem1 negativeItem2 negativeItem3 …… negativeItem99 即每 ...

  4. Laravel框架中Echo的使用过程

    今天的这篇文章中给大家分享关于laravel框架中echo的使用,文章的内容是一步一步来的,用了16步走完一个过程,过程很清晰,希望可以帮助到有需要的朋友吧.话不多说,直接看内容.官方文档推荐使用 P ...

  5. 【MySQL】Mariadb字符集

    Mariadb字符集 如果不设置字符集,可以查看mariadb的字符集的默认设置是latin1. 如下命令,查看Mariadb的默认配置: [root@oradb ~]# /usr/local/mys ...

  6. 那些前端二进制操作API

    一直以来,前端的工作主要涉及的是字符串操作,而对二进制的数据接触较少.但是这种需求却一直存在着,尤其是HTML5之后,随着web应用越来越复杂,File,Blob,TypedArray这些API的出现 ...

  7. redux-thunk形式

    onClick(e) { e.preventDefault(); const { user, pass } = this.refs; this.props.dispatch(login(user.va ...

  8. JavaScript 加减危机——为什么会出现这样的结果?

    在日常工作计算中,我们如履薄冰,但是 JavaScript 总能给我们这样那样的 surprise~ 0.1 + 0.2 = ? 1 - 0.9 = ? 如果小伙伴给出内心的结果: 0.1 + 0.2 ...

  9. .net core vue+wangEditor (双向绑定) 上传图片和视频功能

    最终效果,是这样的,现在开始记录怎么做: 开始 npm 安装 wangEditor 安装好后, 因为要用vue 双向绑定 ,所以 我就把wangwangEditor 做成了一个封装组件,先看一下目录 ...

  10. 让您的WinForm控件快速支持拖拽文件

    实现原理:使用扩展方法. /// <summary> /// 控件扩展 /// </summary> public static class ControlExt { /// ...