MessagePack詳解


版權聲明:分享是一種品質,開源是一種精神。 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.  
    }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM