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

一、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,也包含了各种类型。

类型序号别名备注
Double1"double"
String2"string"
Object3"object"Document类型
Array4"array"
Binary data5"binData"
Undefined6"undefined"Deprecated
ObjectId7"objectId"
Boolean8"bool"
Date9"date"DATE_TIME类型
Null10"null"
Regular Expression11"regex"
DBPoint12"dbPointer"Deprecated
JavaScript13"javaScript"
Symbol14"symbol"Deprecated
JavaScript(with scope)15"javaScriptWithScope"
32-bit integer16"int"
Timestamp17"timestamp"
64-bit integer18"long"
Decimal12819"decimal"New version in 3.4.
Min Key-1"minKey"
Max Key127"maxKey"

四、Bson的格式

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

一、对象

{"hello": "world"} 

hello为key,world为value 对应的是

  \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 结束符

二、数组

{"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]}

对应是

  \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介绍

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

6098829-ec81e98c4d6595c6.png
Bson接口图解1
6098829-d27a4bae23b293cc.png
Bson接口图解2
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AWeiLoveAndroid

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值