我编写了将对象序列化为JSON和BSON的代码。根据我的输出,生成的BSON的大小比JSON大。这是预期的吗?
来自我的代码Bson.class
(使用Jackson和bson4jackson)
private ByteArrayOutputStream baos = new ByteArrayOutputStream();
private BsonFactory fac = new BsonFactory();
private ObjectMapper mapper = new ObjectMapper(fac);
public Bson(Object obj) throws JsonGenerationException,
JsonMappingException, IOException {
mapper.writeValue(baos, obj);
}
public int size() {
return baos.size();
}
public String toString() {
byte[] bytes = baos.toByteArray();
return new String(bytes);
}
来自我的Json.class
private ByteArrayOutputStream baos = new ByteArrayOutputStream();
private ObjectMapper mapper = new ObjectMapper();
public Json(Object obj) throws JsonGenerationException,
JsonMappingException, IOException {
mapper.writeValue(baos, obj);
}
(size()
和toString()
如上所述)
我的POJO是Person.class
和Address.class
。
在我的主要课程中:
Address a = new Address("Jln Koli", "90121", "Vila", "Belgium");
Person p = new Person("Ali Bin Baba", new Date(), 90.0, 12, a);
List<Person> persons = new LinkedList<>();
persons.add(p);
persons.add(p);
Bson bson = new Bson(persons);
Json json = new Json(persons);
System.out.println("Bson : " + bson.size() + ", data : " + bson.toString());
System.out.println("Json : " + json.size() + ", data : " + json.toString());
输出:
Bson : 301, data : -
Json : 285, data : [{"name":"Ali Bin Baba","birthd...
我的问题:
答案 0 :(得分:47)
来自BSON FAQ:
BSON旨在提高空间效率,但在许多情况下并非如此 比JSON更有效率。在某些情况下,BSON使用更多空间 比JSON。其原因是另一个BSON设计目标: 通行性。 BSON增加了一些额外的&#34;信息到文件,比如 长度前缀,可以轻松快速地遍历。
BSON还可以快速编码和解码。例如, 整数存储为32(或64)位整数,因此他们不需要 被解析为文本。对于小型,这比JSON使用更多空间 整数,但解析速度要快得多。
对于字符串字段,JSON中的开销是6个字节 - 4个引号,冒号和逗号。在BSON中它是7 - 条目类型字节,空终止符到字段名称,4字节字符串长度,空终止符到值。
对于整数字段,JSON长度取决于数字的大小。 &#34; 1&#34;只是一个字节。 &#34;百万&#34;是7个字节。在BSON中,这两者都是4字节32位整数。浮点数的情况类似。
BSON并不打算缩小规模。它旨在更接近计算机本地工作的结构,以便更有效地工作 - 这就是&#34; light&#34;的一个含义。
如果您没有追求极端性能(就像设计BSON的MongoDB开发人员那样),那么我建议使用JSON - 人类可读性对开发人员来说是一个很大的好处。只要您使用像Jackson这样的库,以后迁移到BSON应该不会很难 - 正如您可以看到您自己的BSON和JSON类几乎相同。
请记住,如果大小是一个问题,JSON和BSON都应该很好地压缩。
答案 1 :(得分:7)