前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Bson类似于Protocol Buffer的数据形式,比json更轻量级更高效

Bson类似于Protocol Buffer的数据形式,比json更轻量级更高效

作者头像
AWeiLoveAndroid
发布2019-07-25 16:51:32
2K0
发布2019-07-25 16:51:32
举报

一、Bson介绍

BSON是Binary JSON的缩写,是一种类json的一种二进制形式的存储格式。 它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON在JSON基础上进行了一些数据类型的扩展,如Date和BinData类型。

BSON是二进制形式的存储格式,类似于Google的Protocol Buffer。 但是BSON是“schema-less”的存储形式,这使得它在灵活性方面具有优势,但在空间效率方面也有一点劣势(对于序列化数据中包含的字段名,BSON有开销)。


二、特点:

BSON有三个特点:轻量级、可遍历性、高效性。

轻量级

对于任何一种数据表示格式(尤其是在网络上使用时)来说,将存储空间保持在最小值是非常重要的。

可遍历性

BSON被设计成易于操作。这是作为MongoDB的主要数据代表的重要支持。

高效性

由于使用了C数据类型,在大多数语言中,对BSON进行编码和对BSON进行解码都可以非常快速地完成。


三、Bson的数据类型

BSON支持的类型:

有一个枚举BsonType(Bson 3.0新增的枚举),里面就是Bson的所支持的数据类型。

还有一个类BSON,也包含了各种类型。

类型

序号

别名

备注

Double

1

"double"

String

2

"string"

Object

3

"object"

Document类型

Array

4

"array"

Binary data

5

"binData"

Undefined

6

"undefined"

Deprecated

ObjectId

7

"objectId"

Boolean

8

"bool"

Date

9

"date"

DATE_TIME类型

Null

10

"null"

Regular Expression

11

"regex"

DBPoint

12

"dbPointer"

Deprecated

JavaScript

13

"javaScript"

Symbol

14

"symbol"

Deprecated

JavaScript(with scope)

15

"javaScriptWithScope"

32-bit integer

16

"int"

Timestamp

17

"timestamp"

64-bit integer

18

"long"

Decimal128

19

"decimal"

New version in 3.4.

Min Key

-1

"minKey"

Max Key

127

"maxKey"


四、Bson的格式

主要解释bsonspec.org网站上的两个例子

一、对象

代码语言:javascript
复制
{"hello": "world"} 

hello为key,world为value 对应的是

代码语言:javascript
复制
  \x16\x00\x00\x00                   
  \x02
  hello\x00
  \x06\x00\x00\x00world\x00
  \x00 

解释每一行的意思:

\x16\x00\x00\x00:\x表示16进制的方式。4个字节表示文档的大小,包括文档末尾的'\0','\0'是\x00 0x16十进制是22,这个文档的大小是22个字节 采用小端(Little Endian) 原文:Each type must be serialized in little-endian format. 每一种类型必须按照little-endian格式序列化。

\x02一个字节表示value的类型是string,字符串编码使用的是UTF-8

hello\x00表示以'\0'结尾的字符串

\x06\x00\x00\x00world\x00:\\x06\x00\x00\x00 前4个字节表示以'\0'结尾的字符串world的长度

\x00 结束符

二、数组

代码语言:javascript
复制
{"BSON": ["awesome", 5.05, 1986]}

数组['red', 'blue']将要编码为{'0': 'red', '1': 'blue'},key必须按照数值大小递增排序(升序)。 也就是["awesome", 5.05, 1986]将被编码为{ "0":"awesome", "1":5.05,"2":1986} {"BSON": [ "0":"awesome", "1":5.05,"2":1986]}

对应是

代码语言:javascript
复制
  \x31\x00\x00\x00
  \x04BSON\x00
  \x26\x00\x00\x00
  \x02\x30\x00\x08\x00\x00\x00awesome\x00
  \x01\x31\x00\x33\x33\x33\x33\x33\x33\x14\x40
  \x10\x32\x00\xc2\x07\x00\x00
  \x00
  \x00

解释每一行的意思 \x31\x00\x00\x00: 4个字节表示文档的大小,x31的10进制是49,这个文档的大小是49个字节

\x04BSON\x00: \x04表示value的类型是数组表示的document BSON\x00 表示以'\0'结尾的字符串

\x26\x00\x00\x00 : 4个字节表示数组的大小即中括号的内容,x26的10进制是38

\x02\x30\x00\x08\x00\x00\x00awesome\x00: \x02 表示value的类型是string x30表示key,字符0的ASCII码是48,16进制是x30 纵向看正好是x30,x31,x32 \x08\x00\x00\x00 4个字节表示awesome\x00 长度

\x01\x31\x00\x33\x33\x33\x33\x33\x33\x14\x40

\x01 表示64位的二进制浮点数 x31\x00表示以'\0'结尾的字符串1,字符1的ASCII码是x31 x33\x33\x33\x33\x33\x33\x14\x40 double的5.5转换成16进制为40 14 33 33 33 33 33 33

\x10\x32\x00\xc2\x07\x00\x00:\x10表示32位的整数。\x32\x00表示以'\0'结尾的字符串2,字符2的ASCII码是x32 \xc2\x07\x00\x00也就是16进制的7c2转换成10进制是1986

最后两行的\x00 \x00:结束符。

总结:看完了这个介绍,你有什么感觉?真香。写起来太麻烦了,看到这个有点像莫斯密码了,头大了,还是Json写起来简单。 但是Bson在存储上来说比json更轻量级。


五、Bson的一些API介绍

我这里只做了两张图,如下所示:

Bson接口图解1

Bson接口图解2

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.07.24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Bson介绍
  • 二、特点:
  • 三、Bson的数据类型
  • 四、Bson的格式
  • 五、Bson的一些API介绍
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档