MessagePack 新型序列化反序列化方案

来源:http://www.cnblogs.com/oumi/archive/2017/06/24/7074827.html
-Advertisement-
Play Games

進入在學習redis的時候,在文中看到了關於MessagePack的簡介,發現非常有意思,於是就花了點時間大致瞭解了下。 MessagePack介紹: MessagePack is an efficient binary serialization format.It lets you exchan ...


進入在學習redis的時候,在文中看到了關於MessagePack的簡介,發現非常有意思,於是就花了點時間大致瞭解了下。

MessagePack介紹:

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. 

MessagePack  是一個高效的二進位序列化格式。它讓你像JSON一樣可以在各種語言之間交換數據。但是它比JSON更快、更小。小的整數會被編碼成一個位元組,短的字元串僅僅只需要比它的長度多一位元組的大小

支持語言:

MessagePack is supported by over 50 programming languages and environments.

MessagePack和JSON壓縮後文件比較

MessagePack、protocol buffers、json的速度對比

 

MessagePack、protocol buffers、json的速度對比

這張圖片是以前MessagePack 官方網站的首頁圖片,數字對比確實很能反映問題,這裡只討論JSON和MessagePack了

為啥會小呢?先來段json:

{“name“:”heyue“,”sex“:”\u7537“,”company“:”sina“,”age“:30} 

這個json長度為57位元組,但是為了表示這個數據結構(所有標紅色的地方就是他為了表示這個數據結構而不得不添加的),它用了23個位元組(就是那些大括弧、引號、冒號之類的,他們是白白多出來的)。

MessagePack的核心壓縮方式:

1.true、false 之類的:這些太簡單了,直接給1個位元組,(0xc2 表示true,0xc3表示false)

2.不用表示長度的:就是數字之類的,他們天然是定長的,是用一個位元組表示後面的內容是什麼東東,比如用(0xcc 表示這後面,是個uint 8,用oxcd表示後面是個uint 16,用 0xca 表示後面的是個float 32).

3.不定長的:比如字元串、數組,類型後面加 1~4個位元組,用來存字元串的長度,如果是字元串長度是256以內的,只需要1個位元組,MessagePack能存的最長的字元串,是(2^32 -1 ) 最長的4G的字元串大小。

4.ext結構:表示特定的小單元數據。

5.高級結構:MAP結構,就是key=>val 結構的數據,和數組差不多,加1~4個位元組表示後面有多少個項。

這個是官方的數據表示結構文檔:https://gist.github.com/frsyuki/5432559

總的來說,MessagePack對數字、多位元組字元、數組等都做了很多優化,減少了無用的字元,二進位格式,也保證不用字元化帶來額外的存儲空間的增加,所以MessagePack比JSON小是肯定的,小多少,得看你的數據。如果你用來存英文字元串,那幾乎是沒有區別….

為啥會快呢?

先說說JSON怎麼解析吧,我們開發中一般都用cJSON這個庫,cJSON存儲的時候是採用鏈表存儲的,其訪問方式很像一顆樹。每一個節點可以有兄妹節點,通過next/prev指針來查找,它類似雙向鏈表;每個節點也可以有孩子節點,通過child指針來訪問,進入下一層。問題就是首先,構造這個鏈表的時候,得一個字元一個字元地匹配過去吧,得判斷是不是引號、括弧之類的吧…

但是MessagePack 則簡單多了,直接一遍遍歷過去了,從前面的數據頭,就可以知道後面的是什麼數據,指針應該向後移動多少,比JSON的構建鏈表少了很多比較的過程

 

MessagePack主要用於結構化數據的緩存和存儲:

1.存在Memcache中,因為它比json小,可以省下一些記憶體來,速度也比json快一些,頁面速度自然快一個檔次。當然,也有一種情況,我在mc中存json,然後直接出來就是頁面可用的json,都不用解析json了(當然這個在實際開發中比較少見)。

2.存在可以持久化的Key-val存儲中。

 

.NET使用

1.從GIT https://github.com/msgpack/msgpack-cli.git上下載源碼編譯生成DLL

2.示例

using System.IO;
using MsgPack.Serialization;

namespace MsgPack
{
class Program
{
static void Main(string[] args)
{
CreateMsgPack();
}

static void CreateMsgPack()
{
WriteToFile();
ReadFromFile();

using (var stream = new MemoryStream())
{
var serializer = MessagePackSerializer.Create<Person>();
serializer.Pack(stream, CreateIris());
stream.Position = 0;
var person = serializer.Unpack(stream);
}
}

static void WriteToFile()
{
var serializer = MessagePackSerializer.Create<Person>();

using(Stream stream = File.Open(@"C:\Users\Iris\msg.txt", FileMode.Create))
{
serializer.Pack(stream, CreateIris());
}
}

static void ReadFromFile()
{
var serializer = MessagePackSerializer.Create<Person>();

using (Stream stream = File.Open(@"C:\Users\Iris\msg.txt", FileMode.Open))
{
var iris = serializer.Unpack(stream);
}
}

static Person CreateIris()
{
return new Person
{
Age = 28,
Name = "Iris Classon",
FavoriteNumbers = new[] {2,3,4}
};
}

}

public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public int[] FavoriteNumbers { get; set; }
}
}

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • create table DEPT ( deptno NUMBER(2) not null, dname VARCHAR2(20), loc VARCHAR2(13) ); alter table DEPT add constraint PK_DEPT primary key (DEPTNO); c ...
  • 環境:Centos6.6 事先將需要的源碼包打包放在lamp.tar.gz中,並解壓到/root下 [root@zengqingfu ~]# lsanaconda-ks.cfg lamp.sh phpMyAdmin-4.2.5-all-languages.tar.gz 模板avg_score.awk ...
  • 第5節 環境變數與文件查找 《Linux 基礎入門(新版)》學習筆記 ...
  • 有限狀態機(finite state machine)簡稱FSM,表示有限個狀態及在這些狀態之間的轉移和動作等行為的數學模型,在電腦領域有著廣泛的應用。FSM是一種邏輯單元內部的一種高效編程方法,在伺服器編程中,伺服器可以根據不同狀態或者消息類型進行相應的處理邏輯,使得程式邏輯清晰易懂。 那有限狀 ...
  • Centos系統修改hostname的兩種方法——臨時修改與永久修改,另外還介紹了host解析文件的修改。 ...
  • Win10設置多時區時鐘方法技巧,本文小編將向大家介紹如何設置多個時區時鐘,以及如何使用「鬧鐘和時鐘」應用跟蹤更多時區,感興趣的朋友可以參考下麵教程操作。 Win10系統允許用戶配置最多3個不同的時鐘:除顯示本地時間的主時鐘外,還可以另外配置2個不同時區的時鐘。當你單擊或將滑鼠懸停在任務欄日期、時間 ...
  • 配置Ubuntu14.04防火牆 2017-06-23 ...
  • 當添加一個新賬號後,我們可能會發現新賬號sudo 時會報告不在sudoers中,使用su -s時輸入密碼後也會認證失敗 上網搜索大部分都要求修改/etc/sudoers中的內容,但修改這個文件必須需要許可權,這就陷入了死迴圈,故而我們需要更改策略來迂迴更改文件: 1、使用另一個可以使用root許可權的賬 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...