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的设计特点:
此外于json对比,BSON在其基础上增加了“byte array”数据类型。这使得二进制的存储不再需要先base64转换后再存成JSON。大大减少了计算开销和数据大小。
目前在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());
}
}
参考: