【发布时间】:2014-07-29 16:16:01
【问题描述】:
我已经编写了将对象序列化为 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...
我的问题:
- 那个输出是真的,还是我的代码错了?
- 有什么建议可以检查/测试,比较 BSON 和 JSON 的大小?
【问题讨论】:
-
我会尝试解码生成的数据。我会假设 Bson 解码速度更快,而不是更紧凑。
-
如果你想要一个密集的格式并且使用 Java,肯定会选择协议缓冲区,它们比任何一个都更紧凑,而且速度更快,尽管它们需要一个模式。
-
您应该更笼统地说明您的问题,例如“JSON 是否有有效的二进制表示格式”?那么你可能会得到 MessagePack (en.wikipedia.org/wiki/MessagePack) 作为答案。 BSON 实际上不是很好,无论是编码速度还是消息大小或 JSON 兼容性。 MessagePack 在所有方面都更好,但由于它的名称,它没有立即关联为二进制 JSON 格式,这是 BSON 做得更好的部分。