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

类型 序号 别名 备注
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网站上的两个例子

一、对象

{"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介绍

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

Bson接口图解1
Bson接口图解2
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269