降维打击(序列化)的流行手段
message pack,一种非常有潜力的数据格式,市面上还有其他的格式比如json,xml,bson,甚至一些标记语言(html,markdown,yaml)和他们的字符编码utf-8。这些看似毫无关联的标记语言,文件格式和字符编码其实都属于一个大类:序列化格式。
今天来做一个全面对比,对他们的优缺点,性能,应用场景做一个全面分析。
首先的问题是:
啥TM是降维打击?
用一句话说,降维打击是将多维度的数据序列化成一维的通用格式以被不同的平台理解。
什么是多维数据?
从逻辑上不是线性排列的数据就是多维的,最常见的就是树形数据结构,比如引用数据类型:我们在对一个对象进行深拷贝的时候常常需要递归地遍历嵌套树的每一层,才能得到这个对象的全部信息。但是这种树形结构的基本生存资料是对象所在的平台比如JavaScript运行环境,同一个JS对象不能原封不动地拿到Java的环境下使用(虽然感觉底层原理都差不多),反之亦然,就是这个简单的道理:多维数据结构“不通用”,虽然JS对象和Java对象都是多维度的,但多维结构不同。
如何实现跨平台的通用数据格式呢,只能使用一个维度的数据结构,比如字符串(json)。
再举个例子解释什么是序列化,如果不感兴趣可以跳过,直接看之后的各种格式。
抛出一个场景:你要收集一组人的信息:name, last name, nickname, date of birth, 他们的乐器instruments。你可以轻而易举地制作一个电子表格:定义列,将每一行作为一个条目。你甚至还可以定义表格的schema:date of birth必须是number类型,instruments是枚举类型:
name | last name | dob | nickname | instruments |
---|---|---|---|---|
William | Bailey | 1962 | Axl Rose | vocals, piano |
Saul | Hudson | 1965 | Slash | guitar |
你上述的做法其实定义了一个数据结构,如果你只是想在当前的Excel环境下愉快地使用这个表格那没有任何问题,如果想用这个表格和其他人交流(或者和一个服务器,数据库交互),问题就出来了:无论你保存成一个.xlsx文件还是截图发给对方,你的表格都经历了序列化的过程(excel文件序列化和图片序列化)。
序列化也叫编码,与之对应的逆操作就是反序列化或者解码,一维数据抵达不同平台(这里的浏览器,服务器和数据库都是不同的平台)后就要进行反序列化,从而将数据改造成易于自己理解的多维结构。
还有一个很好的解释是,网络只能传输一维的数据流。
各大降维技术优缺点
JSON
优点
1 简单易用开发成本低
5 可以即时编译,用括号和引号闭合数据块的语法可以监测网络是否中断(因为代码可以突然解析失败),这一点优于其他的标记语言比如yaml和markdown。
缺点
1 体积大,影响高并发
之前例子里提到的电子表格用json序列化以后是这样的:
[ { "name": "William", "last name": "Bailey", "dob": 1962, "nickname": "Axl Rose", "instruments": [ "vocals", "piano" ] }, { "name": "Saul", "last name": "Hudson", "dob": 1965, "nickname": "Slash", "instruments": [ "guitar" ] }
]
总结:JSON流行的原因自然离不开它爸爸(JavaScript)。作为JS对象的子集,json是最简单最通用的应用协议之一,使用广泛,开发效率高,但性能相对较低,维护成本较高,所以json有望被message pack取代,参考我的这篇文章。
Protobuf
Protobuf是一种以有效并可扩展的格式编码结构化数据的方式。
优点
1 跨语言,可自定义数据结构。
缺点
1 二进制格式,可读性差(抓包dump后的数据很难看懂)
总结:简单快速上手,高效兼容性强,维护成本较高。
MessagePack
优点
1 跨语言,多语言支持(超多)
4 提供流接口
缺点
1.缺乏复杂模型支持。【但可定制】
总结:高性能但目前的维护成本较高。
YAML
YAML: YAML Ain’t Markup Language.
可我觉得yaml就是个“markup language”,因为yaml.org官网就是用yaml写的:
yaml的可读性可能比json还强,因为它用空白字符实现缩进,取代了括号和引号。yaml还支持特殊的“内部引用”语法,给人一种“可编程”的感觉。事实上yaml的规格超级巨大,非常复杂,和轻量级的json形成鲜明对比
之前提到的电子表格用yaml序列化以后是这样的:
- name: William last name: Bailey dob: 1962 nickname: Axl Rose instruments: - vocals - piano - name: Saul last name: Hudson dob: 1965 nickname: Slash instruments: - guitar
Thrift(Facebook)
优点
1 序列化和RPC支持一站式解决,比pb更方便
缺点
2 不支持双通道
总结:跨语言、实现简单,初次使用较麻烦,需要避免使用问题和场景限制。
BSON
bson有以下特性:
方便存储二进制信息:更适合交换图像和附件
专为快速内存操作而设计
简单的规范:像JSON一样,BSON有一个非常简短的规范
BSON是MongoDB的主要存储结构和传输协议:BSON旨在轻松遍历
额外数据类型:
double(64位IEEE 754浮点数)
date(自Unix纪元以来的整数毫秒数)
字节数组(二进制数据)
BSON对象和BSON阵列
JavaScript代码
MD5二进制数据
正则表达式
BSON的名字取得倒是好听(Binary JSON),容易让人产生一种BSON就是标准二进制json的错觉,我们不能被这个标题党忽悠。
MessagePack VS BSON
这2款产品都宣称是二进制的json,关于2者的优劣一直争论不休。事实上msgpack和bson并不是竞争关系,而是适用于不同场景:
msgpack适用于空间效率要求高的场景:网络传输;
bson适用于时间效率要求高的场景:数据库的CRUD;
所以msgpack更加紧凑,体积小,符合最优编码;而bson比较冗长,但增删改查比较快。
StackOverflow上MessagePack的原作者也给出了自己的看法,客观的说明了msgpack和bson的应用场景:msgpack为网络服务,bson为数据库服务。
但话说回来,现实因素有时候会阻碍我们去使用更新更高效的技术,就像python3之于python2一样。不过我想了一下,我们开发者或者企业家不都是创新者吗?
(完)
【日记】
是时候引入中文标点符号来扩充编程语言的语法了!
翻来覆去的那几个括号和引号明显不够用了,写一个正则表达式要加好几个转义字符,定义一个对象非要用括号来封装成表达式。以上不合理之处都可以通过在语法中加入中文的标点符号来解决:
¥ ; : “ ” ‘ ’ 【 】 、 ? ! … ( ) — 。 , · 《 》
中文有这么多天然的对称字符和不对称字符你们都不用,而且一般字体都符合方块字的正方尺寸,易区分,可读性强。当然这梦一时半会估计实现不了,但如果在未来的编程语言中真的出现了中文语法,你是高兴呢还是不高兴呢?留下你的评论。
降维打击(序列化)的流行手段相关推荐
- 向量数据库入坑:传统文本检索方式的降维打击,使用 Faiss 实现向量语义检索
在上一篇文章<聊聊来自元宇宙大厂 Meta 的相似度检索技术 Faiss>中,我们有聊到如何快速入门向量检索技术,借助 Meta AI(Facebook Research)出品的 fais ...
- 不想被AI降维打击?美国“四院院士”写的DL科普书了解一下
在人工智能『AI』如此火爆的当前,媒体铺天盖地的报道,好像每个人不了解一下 AI 的知识,就会被 AI 替代一样.不管是媒体的背书,亦或者知识更新的必要性,每个人的确有必要去了解一下当前这个最火爆的这 ...
- 如何完成点、线、面的发展,实现降维打击
本来这篇文章是参加24届"光亚展"之后部门的发展路线规划,写着写着就超纲了.但是这篇文章是表述了自己对于企业在"群雄逐鹿"的市场中站稳.显露头角的发展方向和发力 ...
- 营销值得学:创业做生意如何降维打击?
很多网友咨询:创业应该怎么选赛道?做互联网项目创业还是做实体项目创业? 营销值得学先说结论,再说论点! 如果说互联网+项目,那真是太多了! 目前市场环境,创业做生意最好的方向是: 实体行业+互联网:互 ...
- Web3+品牌的大杀器:DAO如何实现对传统品牌彻底的降维打击
01 DAO是品牌的大杀器 在我之前的文章就有预测过,Web3与品牌的结合只有两条路径,一个是Web3会自生长原生品牌发起向现实中的品牌扩大共识,另外一个是Web3是只属于现实中具有某些特性的品牌的沃 ...
- 行业思考 | 互联网对传统行业的降维打击
[行业思考]| 作者 / Edison Zhou 这是EdisonTalk的第301篇原创内容 在周一发布的推文<我在传统行业做数字化转型之预告篇>中,我提到互联网的发展和和竞争对传统行业 ...
- 科技公司逐鹿手机配件赛道,“降维打击”会出现吗?
文|智能相对论(aixdlun) 作者|佘凯文 从去年开始,大宗原材料价格不断上扬,不少材料价格在今年纷纷到达历史巅峰,这深刻地影响着中国制造业,在家电产品外,手机配件也成为"受害者&quo ...
- Python爬虫神器pyppeteer,对 js 加密降维打击
爬虫神器pyppeteer,对 js 加密降维打击 pyppeteer 是对无头浏览器 puppeteer 的 Python 封装.无头浏览器广泛用于自动化测试,同时也是一种很好地爬虫思路. 使用 ...
- 【AI好书】不想被AI降维打击?美国“四院院士”写的这本深度学习科普书了解一下...
欢迎大家来到<AI好书>专栏,这一个专栏是面向所有对人工智能技术感兴趣的朋友.在这个专栏里,我们会给大家推荐人工智能相关的优质书籍. 在人工智能『AI』如此火爆的当前,媒体铺天盖地的报道, ...
- 草根已死 | 互联网精英降维打击
属于草根的互联网时代过去了,越来越多精英加入战斗,并且精英们选择的切入点通常也并不「高大上」,似乎都明白了曲高和寡的道理,要拥抱广大的互联网基层用户,就必须够「俗」,够接地气,这帮精英跳进了本来属于草 ...
最新文章
- 服务器2012用什么虚拟机,虚拟机搭建Windows Server2012测试环境
- 支持分布式数据库同步操作的一个设计点:主键问题
- 解决vue打包后静态资源路径错误的问题
- 你胆敢不加break试试?
- 搜索---广度优先遍历、深度优先遍历、回溯法
- 互联网的未来之上:平权的互联网
- 如何用DAX实现查看每个月中不同类别排名前一位,以及一个简单的svg案例
- jsp include参数传送接收与应用
- 浅谈算法和数据结构: 四 快速排序
- PCB设计经验(1)
- 消融实验(ablation study)是什么?
- 如何在CSDN个人主页添加公众号或者个人微信二维码
- Windows BitLocker驱动器加密
- IE浏览器确定兼容性模式
- 如何才能增强产品的黏性?
- 冲击GCT——考试法宝
- Kaggle—风控相关比赛
- 插画喵课程 玫瑰花怎么画教程(详细步骤)
- matlab errorbare,Matlab – Rhapsody of the Universe
- 【电力电子技术】单相半波可控整流电路
热门文章
- osg显示CEGUI界面
- mysql distance()_mysql距离函数st_distance
- 世界标准时间(UTC) 常识
- mysql中查看密码有效期_Mysql5.7.9密码已过有效期的处理过程
- 【Python】pandas的read_csv参数简略概括(header,path),DataFrame的返回值describe,plot,head
- YC孵化创业营2020-Adora Cheung - How to Prioritize Your Time 如何分配你时间的优先级
- 如何通过KRPano全景资源下载助手来批量下载720yun的全景图
- 常用git命令指南总结
- 如何关闭/屏蔽百度搜索结果的置顶广告?(无耻的百度关了又自己开启)
- 德赛西威Mib280D升级0393版本系统