bson介绍,以及java示例

陶和歌
2023-12-01

BSON介绍

BSON是由10gen公司(开发mongodb数据库的公司)开发的一个数据格式,目前主要用于MongoDB中,是MongoDB的数据存储格式。BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性。

bson官网:http://bsonspec.org/

BSON [bee·sahn]是Binaryary JSON的缩写,是类似于JSON数据结构的二进制编码的序列化文档。像JSON一样,BSON支持数组、对象的嵌套,BSON还扩展了JSON的数据类型,如:BSON具有日期类型和BinData类型。看一个例子:

{
    name:"lemo",
    age:"12",
    last_modified:new Date("27/06/2011"),
    address:{
        city:"suzhou",
        country:"china",
        code:215000
    } ,
    scores:[
        {"name":"english","grade:3.0},
        {"name":"chinese","grade:2.0}
    ]
}

BSON和protobuf二者都是二进制,但BSON比pb更加灵活,因为它schema-less,但其缺点是体积比较大。

BSON的设计特点:

  • 轻巧的:对于任何数据表示格式,尤其是在网络上使用时,将空间开销保持在最小限度是非常重要的。
  • 更快的遍历速度:BSON被定义为易于遍历。对JSON格式来说,太大的JSON结构会导致数据遍历非常慢。在JSON中,要跳过一个文档进行数据读取,需要对此文档进行扫描才行,需要进行麻烦的数据结构匹配,比如括号的匹配,而BSON对JSON的一大改进就是,它会将JSON的每一个元素的长度存在元素的头部,这样你只需要读取到元素长度就能直接seek到指定的点上进行读取了。
  • 高效的:由于使用C数据类型,因此在大多数语言中可以非常快速地执行将数据编码到BSON和从BSON解码的操作。

此外于json对比,BSON在其基础上增加了“byte array”数据类型。这使得二进制的存储不再需要先base64转换后再存成JSON。大大减少了计算开销和数据大小。

BSON的java实现

目前在10gen的努力下,BSON已经有了针对多种语言的编码解码包。并且都是Apache 2 license下开源的。并且还在随着MongoDB进一步地发展。在这里可以看到各种语言的实现:http://bsonspec.org/implementations.html

对于java,推荐使用bson4jackson这个库(https://github.com/michel-kraemer/bson4jackson )

<dependency>
        <groupId>de.undercouch</groupId>
        <artifactId>bson4jackson</artifactId>
        <version>2.11.0</version>
    </dependency>
public class Person {
  private String _name;

  public void setName(String name) {
    _name = name;
  }

  public String getName() {
    return _name;
  }
}

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.undercouch.bson4jackson.BsonFactory;

public class ObjectMapperSample {
  public static void main(String[] args) throws Exception {
    //create dummy POJO
    Person bob = new Person();
    bob.setName("Bob");

    //serialize data
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectMapper mapper = new ObjectMapper(new BsonFactory());
    mapper.writeValue(baos, bob);

    //deserialize data
    ByteArrayInputStream bais = new ByteArrayInputStream(
      baos.toByteArray());
    Person clone_of_bob = mapper.readValue(bais, Person.class);

    assert bob.getName().equals(clone_of_bob.getName());
  }
}

参考:

https://michelkraemer.com/binary-json-with-bson4jackson/

 类似资料: