数据序列化比较:JSON,YAML,BSON,MessagePack

数据序列化比较:JSON,YAML,BSON,MessagePack

JSON是Web上数据交换的事实上的标准。JSON(JavaScript对象表示法)是一种轻量级的数据交换格式。 人类易于读写。 机器很容易解析和生成。
JSON是最广泛的数据序列化格式,它具有以下功能:
人类可读的代码
非常简单明了的规范 :整个规范的摘要仅放在一个页面上。
广泛的支持 :不仅每种编程语言或IDE都具有JSON支持,而且许多Web服务API都提供JSON作为数据交换的方式。

BSON是Binary JSON的缩写,是类似于JSON的文档的二进制编码序列化。
JSON是纯文本格式,虽然二进制数据可以用文本编码,但它具有一定的局限性,并且会使JSON文件很大。 BSON致力于解决这些问题。
它具有以下功能:
方便地存储二进制信息 :更适合交换图像和附件
设计用于快速的内存操作
简单的规范 :与JSON一样,BSON的规范非常简短
MongoDB的主要数据表示形式 :BSON旨在易于遍历

消息包 (MessagePack)
就像JSON。 但是又快又小。
MessagePack (也为msgpack)是用于序列化的另一种二进制格式。 虽然不如BSON出名,但是值得一看。
其功能包括:
专为高效的线上传输而设计
JSON兼容性比BSON更好
小于BSON :具有比BSON小的开销 ,并且在大多数情况下可以序列化较小的对象
类型检查 :它支持静态类型
streaming API :支持流式反序列化器,这对于网络通信很有用。

YAML:YAML不是标记语言。 简介:YAML是适用于所有编程语言的人类友好数据序列化标准。
回到纯文本格式, YAML是JSON的替代方法:
(确实)人类可读的代码 :YAML可读性强,甚至其首页内容也显示在YAML中以说明这一点
紧凑代码 :空格缩进用于表示结构,无需引号或括号
关系数据的语法 :允许带有锚点( & )和别名( * )的内部引用
特别适合查看/编辑数据结构 :例如配置文件,调试期间的转储和文档头
丰富的语言独立类型集

序列化时BSON比JSON昂贵,反序列化时则更快。 MessagePack在任何操作上都比两者都快。 同样,由于其开销,并且尽管是二进制格式,但是在存储非二进制数据时,BSON文件有时可能会比JSON文件大。
即使对于相同格式,性能也会因选择的序列化器和解析器而有所不同。
尽管听起来很愚蠢,但BSON却具有名称的优势 :人们自动将MongoDB(BSON)开发的格式链接到标准(JSON),而标准彼此之间没有关联。 因此,当搜索JSON的二进制替代方案时,您还可以考虑其他选项。
实际上, MessagePack在各个方面似乎都击败了BSON :它更快,更小,并且与BSON更加兼容JSON。 (实际上,如果您已经在使用JSON,则MessagePack几乎是一个嵌入式优化。)
不过, BSON是MongoDB用来存储和表示数据的格式 ,因此,如果您使用此NoSQL DB,那就是坚持使用它的原因。
当然,序列化并不仅仅是存储二进制数据。 诚然,JSON具有不同的目标- “人类可读”的目标 。 但是,无需花费太多精力即可注意到YAML在此方面做得更好。
但是, YAML规范非常庞大 ,特别是与JSON相比。 但是可以说,它一定是必须的,因为它带有更多的数据类型和功能。
另一方面,不容忽视的是,JSON的简单性在采用其他序列化格式方面起着关键作用。 它依赖于已经存在的广泛使用的语言JavaScript,并且,如果您知道或接触过JS(如果您在Web开发行业,那么您就是),那么您已经知道JSON。
那为什么不像现在这样采用YAML呢? 在许多情况下,这并不容易。 JSON仍然是Web API的一席之地,因为您可以轻松地将JSON代码嵌入到HTTP请求中(对于GET,如在URL中,对于POST,如在发送表单中):该格式将让您知道传输是否突然中断 ,
因为该代码将自动使无效,而YAML和其他竞争的纯文本格式可能不是这种情况。 另外,您仍然需要与基于JSON的API和旧版代码在某一点或另一点进行交互,并且出于同一目的(数据序列化)而同时维护两段代码(JSON和YAML方法)总是很麻烦的。
我已经(以相当随意的方式)遗漏了许多其他序列化格式,例如协议缓冲区 (protobuf,也是二进制)。
分层数据格式版本5( HDF5 )并不是真正用于序列化,而是用于存储, 它正在席卷数据科学和其他行业 。 这是一种非常快速且通用的格式,不仅可以用于存储许多数据结构,甚至可以替代关系数据库。
如果您喜欢使用BSON和MessagePack之类的二进制格式来存储/交换大量信息,那么您可能很想看看HDF5。

posted @ 2021-01-12 09:50  delphi中间件  阅读(2060)  评论(0编辑  收藏  举报