MessagePack 新型序列化反序列化方案
进入在学习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 官方网站的首页图片,数字对比确实很能反映问题,这里只讨论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; }
}
}
MessagePack 新型序列化反序列化方案的更多相关文章
- 序列化 反序列化 MessagePack for C#
阅读目录 快速序列化组件MessagePack介绍 简介 使用 快速开始 分析器 内置的支持类型 对象序列化 DataContract兼容性 序列化不可变对象(序列化构造器) 序列化回调 Union ...
- 一个更好的C++序列化/反序列化库Kapok
KapokFAQ1.Kapok的特点简单,易用,header-only,只需要引用Kapok.hpp即可:高效,初步测试性和messagepack相当.它是纯c++11实现,因此需要支持C++11的编 ...
- JSR310-LocalDateTime序列化 & 反序列化
问题 springboot 版本:spring-boot 2.3.12 今天在开发一个redis 热key服务端的过程中,碰到2个问题: jdk8的LocalDateTime,LocalDate,Lo ...
- php json与xml序列化/反序列化
在web开发中对象的序列化与反序列化经常使用,比较主流的有json格式与xml格式的序列化与反序列化,今天想写个jsop的小demo,结果发现不会使用php序列化,查了一下资料,做个笔记 简单数组js ...
- 序列化反序列化api(入门级)
定义: java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 为什么字符串通常也会进行序列化? 对象需要进行序列化的原因:保证对象的状态不变 ...
- python_way ,day5 模块,模块3 ,双层装饰器,字符串格式化,生成器,递归,模块倒入,第三方模块倒入,序列化反序列化,日志处理
python_way.day5 1.模块3 time,datetime, json,pickle 2.双层装饰器 3.字符串格式化 4.生成器 5.递归 6.模块倒入 7.第三方模块倒入 8.序列化反 ...
- C#之你懂得的序列化/反序列化
前言:写此文章一方面是为了巩固对序列化的认识,另一方面是因为本人最近在面试,面试中被问到“为什么要序列化”.虽然一直在使用,自己也反复的提到序列化,可至于说为什么要序列化,还真的没想过,所以本文就这样 ...
- springboot学习(三)——http序列化/反序列化之HttpMessageConverter
以下内容,如有问题,烦请指出,谢谢! 上一篇说掉了点内容,这里补上,那就是springmvc的http的序列化/反序列化,这里简单说下如何在springboot中使用这个功能. 使用过原生netty ...
- java序列化反序列化深入探究
When---什么时候需要序列化和反序列化: 简单的写一个hello world程序,用不到序列化和反序列化.写一个排序算法也用不到序列化和反序列化.但是当你想要将一个对象进行持久化写入文件,或者你想 ...
随机推荐
- Python 之多线程应用
import socket from threading import Thread def recv_data(): while True: recv_info = udp_socket.recvf ...
- Jmeter读取excel表中用例数据实现接口压测
传统的接口测试,都是在接口中手动输入不同用例准备的多种场景参数数据,一遍一遍的输入来执行多个不同的用例,但是现在利用excel表格准备各种类型的数据,使用Jmeter中Jmeter CSV Data ...
- MySQL多表连接操作
select * from userinfo ,dapartment where userinfo.part_id = dapartment.id; --左连接: 左边全部显示 select * fr ...
- emacs 定制进缩风格
纵览 emacs 文档中描述,进缩风格实现只需要两步:第一步,根据内容与上下文找到对应的进缩风格的类别:第二步,依据进缩风格决定的表达式锚点的进缩偏移.下面我们对 cc-mode 风格定制加以说明. ...
- 70. Climbing Stairs(动态规划)
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- JPA学习(基于hibernate)
参考博客:https://blog.csdn.net/baidu_37107022/article/details/76572195 常用注解: https://blog.csdn.net/eastl ...
- Vim+xxd=强大的十六进制编辑器
Vim 是黑客文化中强大的编辑器.利用它调用外部十六进制文件显示命令xxd就可以顺利的编辑二进制文件了. 其中,%在vimComandLine时代表当前文件的路径,xxd是以十六进制显示一个文件,xx ...
- [bzoj1941][Sdoi2010]Hide and Seek_KD-Tree
Hide and Seek bzoj-1941 Sdoi-2010 题目大意:给出平面上n个点,选出一个点,使得距离这个点的最远点曼哈顿距离减去距离这个点的最近非己点的曼哈顿距离最小.输出最小曼哈顿距 ...
- 洛谷—— P1379 八数码难题
https://daniu.luogu.org/problem/show?pid=1379 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示 ...
- 洛谷——P2639 [USACO09OCT]Bessie的体重问题Bessie's We…
https://www.luogu.org/problem/show?pid=2639 题目描述 Bessie像她的诸多姊妹一样,因为从Farmer John的草地吃了太多美味的草而长出了太多的赘肉. ...