• 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、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:UsersIrismsg.txt", FileMode.Create))
    {
    serializer.Pack(stream, CreateIris());
    }
    }
    
    static void ReadFromFile()
    {
    var serializer = MessagePackSerializer.Create<Person>();
    
    using (Stream stream = File.Open(@"C:UsersIrismsg.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; }
    }
    }
    

      

  • 相关阅读:
    HTML页面跳转的5种方法
    利用jquery来进行表单的多向提交
    HTML设置超链接字体颜色和点击后的字体颜色
    bootstrap精简教程
    类型的转换的神秘
    [转载] mysql 索引中的USING BTREE 的意义
    [转载]WeeksInAYear、WeeksInYear、DaysInAYear、DaysInAMonth、DaysInYear、DaysInMonth
    范围内取随机数
    [转载]asp.net中,<%#%>,<%=%>和<%%>分别是什么意思,有什么区别
    [转载]localStorage使用总结
  • 原文地址:https://www.cnblogs.com/oumi/p/7074827.html
Copyright © 2020-2023  润新知