专栏首页Web行业观察Zipack初体验:我的开源标准!

Zipack初体验:我的开源标准!

私货时间到~

JSON vs Zipack

当今最流行的序列化格式无疑是JSON,但是基于文本的JSON有许多缺点,比如解析速度慢,体积较大。根本原因在于,JSON是基于文本的,只要是文本就离不开编译,只要编译就永远没有二进制格式来的快,而只有基于前缀的二进制格式能克服这些问题。经过若干个月的打磨,我设计出了一套紧凑的、无协议的二进制序列化格式Zipack用来取代JSON,为数据的存储和传输提供更好的方案。

  • 官网:https://zipack.gitee.io/
  • Gitee仓库:https://gitee.com/zipack/
  • 文件后缀名:.zipack
  • mime类型:application/zipack

Zipack初体验

在线体验:https://zipack.gitee.io/#demo

在官网的在线demo中,我们可以输入任意的JSON串,下面会自动生成相对应的Zipack字节串(16进制),不同的是,体积大大压缩了!事实上,Zipack采用的是变长前缀编码,简单地说,更常用的类型更短,比如0~127的正整数只占一个字节,短的字符串只需额外一个字节来表示类型和长度。

拒绝Base64,随意插入纯二进制数据

想象一下,如果想要在JSON中插入一个纯二进制数据,我们得使用Base64等手段把字节串序列化成字符串再插入JSON,但用Base64编码的后果就是,体积膨胀1/3。在Zipack中就不会出现这个问题,因为Zipack有一个基本类型就是字节串!比如在JavaScript中,我们可以这样定义一个文件对象,包括文件名,mime类型以及文件内容:

zipack.serialize({
    name: 'binary-file.bin',
    mime: 'application/octet-stream',
    file: new ArrayBuffer(8)
})

这里我们使用的软件是zipack.js,这也是Zipack官方提供的JavaScript版本的编解码器,之前的在线demo也用的它。如果你觉得还可以,记得回来star,follow一下我的仓库哦,地址:https://gitee.com/zipack/zipack-javascript。

迷惑行为大赏:0.1和0.5的区别

只有一个特殊情况下压缩率是超过100%的,如果输入的是一个不能被2的幂整除的十进制小数,那它的Zipack值反而变大了,观察下面这2种情况:

当我们输入0.5,压缩率是100%,但输入0.1时压缩率变成167%,体积反而变大了,这是因为十进制的0.5用二进制表示为0.1,但是十进制的0.1用二进制表示就是0.00011001100110011001100110011001100110011......无限循环。这是因为0.5可以表示为1/2,分母的2的幂,但0.1无法这样表示,所以0.1无法用二进制精确地表示,小数点后面只能拖很长的一条尾巴,于是zipack的体积反而变大了。但是不用担心,在正常情况下我们存放在内存中的小数都是二进制的,不会出现这种问题。

Zipack的优势

  1. 体积更小:可以将JSON压缩至70%左右。
  2. 速度更快:基于前缀的二进制格式无须编译,比文本格式更快。
  3. 类型丰富:支持Number,String,Bool,Null,ByteArray,List,Map(字典)以及保留类型。
  4. 变长编码:根据Huffman编码,常用的类型更短,如小整数只占1个字节。
  5. 原创算法:在处理字符串和浮点数上,Zipack采用压缩率更高的编码来取代标准的UTF8和IEEE浮点数,具体原理请参考Zipack的格式规范。
  6. 自由扩展:Zipack提供保留前缀,开发者可借此添加新的类型。
  7. 流化传输:处理大数据的时候,Zipack可以无缝拼接,边传输边处理。

好啦,以上就是我给大家带来的Zipack初体验,但本文尚未涉及Zipack是如何实现的,下一期我将带给大家一篇详细的说明文来介绍Zipack的底层原理以及近乎完美的设计理念,当然你也可以去官方的Gitee仓库阅读Zipack规范:https://gitee.com/zipack/spec。如果可以科学上网的话,建议直接去Github仓库上阅读“原著”:

https://github.com/zipack/spec

最后别忘了star和follow,如果还能打赏,那将是对我对大的鼓励。

本文分享自微信公众号 - WebHub(myWebHub),作者:金恒昱

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 你所不知道的JSON

    JSON已经逐渐替代XML被全世界的开发者广泛使用。本文深入讲解JavaScript中使用JSON.stringify的一些细节问题。首先简单回顾一下JSON和...

    Jean
  • 一句话判断IE浏览器

    if(window.addEventListener){ alert("not ie"); }else if(window.attachEvent){ ...

    Jean
  • 原创反转精度算法:小数的终极编码

    上期带大家尝鲜了Zipack格式的“多快好省”:“多”指功能多;“快”指解析快;“省”指体积小。不过用户最好奇的一定是Zipack的底层原理,毕竟它“嚣张”地宣...

    Jean
  • SLF4J MDC ☞ 将用户信息添加到日志信息中

    你是否有过排查某个用户的操作出现 BUG 时, 从茫茫日志中寻找这个用户操作的痛苦经历, SLF4J 为我们提供了一种基于 ThreadLocal 来实现的 M...

    一份执着✘
  • Angularjs基础(五)

    AngularJS Select(选项框)     AngularJS 可是使用数组或对象创建一个下拉列表选项。 使用ng-options创建选项框    ...

    用户1197315
  • 程序员的心理疾病

    由于程序员工作的性质,他们长期以来受到的所谓“黑客”式的“熏陶”,形成了一种行业性的心理疾病。患了这种病的人对于很多新入行的人,甚至一些外行人士造成了持续的伤害...

    老钱
  • python中range()函数的用法

    py3study
  • BlockStack身份授权流程

    去中心化身份的前提条件,是在同一个身份平台所能覆盖的范围内,用户的身份识别和检测标准统一,作为区块链应用开发基础设施的服务提供商,BlockStack 在数据权...

    rectinajh
  • 美团机器学习算法岗实习四面面经(推荐系统方向)

    “ 本篇内容为师妹在美团面试时的相关记录,希望对目前学习推荐系统方向的朋友们一些方向指引,同时也希望对寻找推荐系统相关工作的朋友们一些借鉴意义。如有相关问题,请...

    张小磊
  • 算法面试指南

    算法是技术面试的重要组成部分,尤其是在国内外的大厂中。本文将为你介绍在面试中需要了解的常见算法以及提高它们效率的方法(这是面试中常见的问题),最后会为你提供一些...

    疯狂的技术宅

扫码关注云+社区

领取腾讯云代金券