`
vanadiumlin
  • 浏览: 504878 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

运用BSON将数据记录转换成二进制

 
阅读更多
按照惯例,我在这里先介绍一下什么是BSon。

BSon是Binary JSON的简称,是一种类Json的一种二进制形式的存储格式。目前Bson主要被MongoDB(目前一个较为流行的非关系数据模型的开源数据库)使用于存储数据和网络数据交换。

下面我们进入正题,介绍一下BSon是怎么把一个个MongoDB的文档转换成二进制形式进行存储的,在此之前读者需要从BSon官网上大致了解一下其解释的规则,链接会在下面的参考资料中给出。

至于介绍的形式,当然是给出例子,为大家讲解每个转换的步骤。

在介绍转换步骤之前,读者需要了解BSon中有四种基本类型

名称 存储大小 说明
byte 1 byte (8-bits) 最小单位,只占有一个字节,一般对应于一个字符(用ASCII表示)
int32 4 bytes (32-bit signed integer) 32位整型占用4个字节
int64 8 bytes (64-bit signed integer) 64位整型占用8个字节
double 8 bytes (64-bit IEEE 754 floating point) 双精度浮点型占8个字节,需要用IEEE 754的浮点型规则进行表示
下面给出例子

例1:

1 {
2 "Name": "DataResearchLab",
3 "IsGreat":true,
4 "Feilds":["CloudComputing","NoSQL","BigData"]
5 }
先来说明一下这个例子,这个就是非关系型数据库中存放数据的形式,在BSon上的解释就是相当于一个Document。如果要用关系型数据库进行解释的话,这个就相当于一个记录,但是这个记录有自己的列名。继续解释上面的记录,最外面的"{}"相当于变成语言中"{}" 的作用,即表示一个范围,也就是说这里面的数据是作为一个整体需要进行存储的。里面的":"左面可以理解为是键值,即一个数据库中只有唯一的一个键值。顺便提一下,在BSon所有的键值都被视为cstring 类型(BSong存储的基本类型中的一种)。":"的右面是左面键值对应的值,这个值可以有很多形式,如布尔型,字符串,32位整型,浮点型,甚至是数组,JavaScript的代码,正则表达式或是在嵌套一个Document等等,具体有什么读者可以查看BSon官网的介绍。

再返回来看这个例子,照之前的解释,相当于用户想要在数据库中存储一个数据,这个数据包括三个数据项。其中键值"Name"对应存储的数据是字符串型的"DataResearchLab ",键值"IsGreat"对应存储的数据是布尔型数据true,键值"Feilds"对应存储的是一个数组型的数据"["CloudComputing","NoSQL","BigData"]"。

接下来进入正题,看看运用BSon是怎么把该数据转换成二进制形式在非关系数据库中存储的。数据被作为一个Document跟据BSon的规则(具体规则这里不给出,请查看BSon官网的规则说明)需要进一步进行分解为三项int32,e_list, "\x00"。

先来介绍一下int32。int32需要占用四个字节,但是这个有两点需要特别注意。第一点就是,Document解释成的int32是用来计算该Document的长度的,但这个长度包含本身自己int32四个字节的长度。以本例来算,总共的Document需要102个字节,这102个字节包括本身int32所占的四个字节和后面所解释出的所有的所需的字节长度,当然102个字节在一开始是没法算出来的,只有将该Document都解释完才会算出这个数据。第二点要说明的是,存储长度本身占有四个字节,而这四个字节需要高位存储。至于什么是高位存储,这里只给一个简单的解释,就是四个字节中的最低位字节对应到存储器的最高位,最高为的字节对应到存储器的最低位。本例中需要102个字节,对应到十六进制是"\x66\x00\x00\x00",而不是"\x00\x00\x00\x66"(这种存储形式是低位存储)。

接下来说一下"\x00"。这个对应过来的十六进制相当于是一个结束符,有点类似于程序设计语言中字符串类型最后的"\0"。表示该部分解释的结束。

下面介绍关键的部分e_list。e_list也只是BSon规则中的一个中间形式,即e_list需要进行进一步的解释。e_list的进一步解释成两部分。第一部分是element,第二部分是e_list或是""。先说一下第二部分,在此时第一步解释出的e_list需要将第二部分解释成e_list。为什么呢,因为例子中需要存储的并不只有"Name"一项,在其后面还有"IsGreat"和"Feilds"需要解释,换句话说e_list这一步需要进行递归,继续循环解释。那么什么是后e_list解释成""呢?当解释到最后一项"Fields"时,后面没有需要存储的数据项时,需要将其第二部分解释成"",这还需要注意一点的是""并不占用存储空间,也就是说它是没有长度的,可以理解为""在BSon的解释最后的形式中并不存在。

回来说第一部分element。需要说明的是element也是作为一个中间形式需要继续往下解释,element也是BSon中最丰富的解释,也就是说它可以被解释成很多的形式。而解释成哪种形式需要针对于存储数据的类型进行选择。注意这里存储数据的类型指的不是键值,因为前面已经说过BSon把所有的键值只解释成为cstring一种类型,这里说的存储数据类型是指与键值一一对应的数据的类型。这里"Name"所存储的类型是BSon基本存储类型中的"UTF-8 string"。后面"IsGreat"和"Fields"分别对应的是BSon基本存储类型中的"Boolean "true""和"Array"。

继续说"Name"部分的解释。前面一段已经说过其对应的是基本存储类型中的"UTF-8 string"。那么根据BSon的规则element需要解释成"\x02",e_name,string三部分。第一部分对应的是最后的存储形式,它代表了这种选择的类型,即"\x02"。第二部分e_name需要进一步唯一解释成cstring,即键值的类型。而cstring也需要进行唯一解释成(byte*)和"\x00"。(byte*)代表存储的是键值本身,即"Name"(这里不包括双引号"")。而"\x00"和之前的一样,代表这部分解释的结束。string跟上,需要唯一解释成int32,(byte*)和"\x00"三部分。下面来看这三部分。先来解释第二部分和第三部分,这两部分的含义和以前出现这两部分的含义是相似的,也就是说(byte*)代表存储了"DataResearchLab"(之前代表的是键值,这里代表的是数据值)。"\x00"代表了这部分的结束。第一部分这里也有一个int32的类型,但是绝对要注意的是这与Document中解释出的int32是不一样的。在Document中解释出来的int32用加粗字体说了两个注意事项,这里要说明stirng解释的int32和Document相同和不相同的地方。string解释出的int32同样是进行高位存储,但是不同点在于算出后面解释出二进制的长度不包括int32本身的四个字节。这个int32存储的是"\x10\x00\x00\x00",这包括"DataResearchLab"15个字节和结束符号"\x00"一个字节。

其实,到这里,对于"Name"键值这部分的存储已经介绍完毕,但是对于整个例子的存储还远没有结束。

读者应该还记得前面提到的e_list,它是递归循环的。第二个e_list同样的被解释成两部分,第一部分是element,第二部分是e_list。第一部分的element跟据数据类型是布尔型的"true"对应到BSon的规则解释成为"\x08",e_name,"\x01"。和之前介绍的这部分的类似"\x08"代表了这种对应关系的类型,而最后的"\x01"则代表为true(如果是false的布尔类型这部分对应的是"\x00")。e_name同样的被唯一解释,这里和"Name"部分一样,不再多说,请读者自己思考。第二部分是e_list同样的被解释成为两部分element和""(因为后面已经没有数据项了)。

对于element,由于对应的数据类型是"Array",将其解释成"\x04",e_name和Document。"\x04"和e_name的分析也请读者按照之前的讲述自己进行分析。对于后面出现的Document,完全是类似于例子最开始部分的那个Document进行解释,读者可以自行分析。但是这里出现了一个问题,因为数组中的数据项并没有相应的键值与其对应。其实不然,BSon是将数组元素的下标(从0开始)作为其键值的。这部分就转换成一个嵌套的Document,形式如下

1 {
2       "0":"CloudComputing",
3       "1":"NoSQL",
4       "2":"BigData"
5 }
接下来的步骤请读者自己分析。需要注意的一点是BSon对于数据的顺序是有严格区分的,数组中的顺序是有区别的。

最后这里给出本例子的解释过程和最后解释的二进制形式如下图所示,希望读者可以自己分析完后对照一下。

参考答案

由于本人也是初步接触这部分内容,欢迎各位读者一块进行讨论。

另外,还要感谢和我一起学习这方面知识的同学们以及老师。

参考资料:

BSon官网解释规则:http://bsonspec.org/#/specification
分享到:
评论

相关推荐

    Bson:Bson是一个Java库,可用于将Java对象转换为二进制数据以进行存储传输使用更少的空间

    value根据实际的类型转换为二进制保存。二级制保存文件本身包含格式信息,但只包含层级和基本类型,不包含属性名使用方式Bson bson = new Bson();文档梳理【腾讯文档】Bson格式设计1字节Version + 对象数据对象数据...

    BSON Console 例子

    BSON的主要优点在于其二进制特性,它能够将JSON对象转换为二进制形式,减少数据的存储空间,并且在处理大量数据时,其解析和序列化速度显著快于纯文本的JSON。这对于需要频繁交换大量结构化数据的Web服务和分布式...

    手机端后台向前台传输数据的二进制压缩方法

    开发者可以学习如何将JSON数据转换为二进制,以及如何使用压缩库如Gzip进行数据压缩和解压。 总结来说,理解并掌握二进制压缩方法对于优化移动应用的数据传输至关重要。通过合理选择二进制编码格式、压缩算法,并...

    Go-各种传输二进制数据编码格式的Golang示例与比较

    - **简介**:protobuf是由Google开发的一种高效的数据序列化协议,它定义了一种结构化的数据表示方式,然后将这些数据转换为二进制格式,以减少存储和传输的开销。 - **Go中的使用**:Go的protobuf支持通过`protoc...

    JSON BSON 效率比较

    在效率方面,BSON的二进制性质使其在解析和编码时速度更快,因为计算机处理二进制数据比处理文本数据更高效。然而,JSON的文本格式使得它在网络传输中更友好,因为文本数据可以被任何支持JSON的平台理解和处理,无需...

    json_bson.zip

    与JSON相比,BSON在数据中嵌入了二进制数据和日期等复杂类型,同时在序列化时可以节省空间。BSON文档使用类似JSON的结构,但以二进制形式存储,因此它更适合高性能的应用场景。 在QT库中,QJsonDocument类提供了...

    android-bson

    BSON是一种二进制形式的数据表示方法,它在JSON基础上增加了对日期、二进制数据、大型整数等类型的支持,同时以更紧凑的格式存储数据,提高了序列化和反序列化的效率。 BSON协议在Android中的应用通常涉及以下几个...

    C++实现的BOSN bson-cpp的编译

    在IT行业中,BSON(Binary JSON)是一种数据序列化格式,它类似于JSON,但使用二进制表示形式,使得在存储和传输数据时更高效。BSON-cpp是C++实现的一个库,允许开发者在C++项目中方便地处理BSON数据。本篇文章将...

    bson_json.zip

    BSON提供了一种二进制形式的数据表示,适合于高性能的网络通信和数据库存储,而JSON则是一种轻量级的人可读文本格式,广泛用于Web服务和API接口。本篇文章将探讨如何在Golang中进行BSON到JSON以及JSON到BSON的转换,...

    C# BSON 协议

    C# BSON(Binary JSON)协议是一种数据序列化格式,它以二进制形式表示JSON(JavaScript Object Notation)数据,从而提供更快的读写速度和更小的数据传输体积。在.NET环境中,C#开发者可以利用BSON库来处理这种数据...

    前端项目-js-bson.zip

    例如,通过Ajax请求获取BSON数据,然后使用js-bson将其转换为JavaScript对象,再在前端进行渲染和操作。同时,前端也可以将修改后的数据序列化回BSON,发送回服务器进行持久化存储。 总结起来,"前端项目-js-bson....

    Python库 | bson-0.4.2.tar.gz

    BSON是Binary JSON(二进制JSON)的缩写,是一种数据序列化格式,类似于JSON,但支持更多的数据类型,如日期、正则表达式和二进制数据。BSON的设计目标是在保持JSON的易读性和灵活性的同时,提高在网络中的传输效率...

    BSON格式解释编程开发技术共4页.pdf.zip

    BSON,全称为Binary JSON(二进制JSON),是一种数据存储格式,旨在提供与JSON(JavaScript Object Notation)相似的数据结构,但以二进制形式表示,从而在处理大量数据时提高性能。BSON在很多现代数据库系统和应用...

    mongodb BSON的基本使用教程

    BSON(Binary JSON)是MongoDB中用于存储数据的二进制格式,它结合了JSON的易读性和二进制数据的效率。本教程将详细介绍MongoDB中的BSON使用,以及如何通过Go语言的mgo驱动进行操作。 1. **BSON数据类型与结构体...

    cpp-MongoDBLibbson一个BSON实用函数库

    BSON是二进制形式的JSON(JavaScript Object Notation),它扩展了JSON,增加了日期、正则表达式、二进制数据等类型,同时也提高了序列化和反序列化的速度。BSON文档是键值对的集合,类似于JSON对象,但可以用更高效...

    bson-0.4.8

    在bson-0.4.8库中,开发者可以创建这些BSON对象,并将它们转换为JSON或其他数据格式。 2. **性能优化**: BSON库的一个关键优势在于其高效性。由于它是二进制的,相对于纯文本的JSON,BSON在存储和传输时占用更少...

    Node.js-JacksonJSON处理器的一个BSON生器和解析器

    然而,有时我们需要处理的数据量较大,或者包含非JSON格式的数据类型,如二进制数据,这时就需要引入BSON(Binary JSON)。 BSON是一种扩展了JSON的序列化格式,它可以存储日期、正则表达式、二进制数据等在JSON中...

    数据通信-序列化协议 protocol json

    序列化协议是指将数据结构或对象转换成二进制串的过程,而反序列化则是将序列化后的二进制串反向还原成数据结构或者对象的过程。在本文中,我们将详细介绍序列化协议的重要性、现状、问题以及解决方案。 序列化协议...

    libbson-1.2.0

    BSON是一种高效的二进制数据序列化格式,它扩展了JSON(JavaScript Object Notation)格式,增加了对日期、数组、二进制数据等类型的支持,适用于网络通信和数据库存储。在MongoDB的开发和应用中,libbson库扮演着至...

    mongodb bson

    BSON(Binary JSON)是MongoDB中的数据序列化格式,它在JSON的基础上增加了二进制支持,使得数据存储更加高效。在Java环境中,与MongoDB进行交互通常需要依赖特定的驱动程序,如`mongodb-driver-core`、`mongo-java-...

Global site tag (gtag.js) - Google Analytics