Подтвердить что ты не робот

Какой из них легче, JSON или BSON?

Я написал код для сериализации объектов в JSON и BSON. Согласно моей продукции, BSON выпускается больше по размеру, чем JSON. Ожидается ли это?

Из моего кода для Bson.class (используя Jackson and 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?
4b9b3361

Ответ 1

Из FAQ BSON:

BSON предназначен для эффективного использования в космосе, но во многих случаях это не гораздо более эффективный, чем JSON. В некоторых случаях BSON использует еще больше места чем JSON. Причина этого - еще одна из целей проектирования BSON: traversability. BSON добавляет некоторую "дополнительную" информацию в документы, например которые позволяют легко и быстро перемещаться.

BSON также предназначен для быстрого кодирования и декодирования. Например, целые числа хранятся в виде 32 (или 64) битовых целых чисел, поэтому им не нужно анализируется и из текста. Это использует больше пространства, чем JSON для небольших целые числа, но намного быстрее разобрать.

Для строкового поля служебные данные в JSON составляют 6 байт - 4 кавычки, двоеточие и запятая. В BSON это 7 - тип байта ввода, нулевой ограничитель для имени поля, длина строки 4 байта, нулевой ограничитель для значения.

Для целочисленного поля длина JSON зависит от размера числа. "1" - всего один байт. "1000000" - 7 байт. В BSON оба из них были бы 4-байтовым 32-битным целым числом. Ситуация с числами с плавающей запятой аналогична.

BSON не должен быть меньше. Он предназначен для того, чтобы быть ближе к структурам, с которыми компьютеры работают с изначально, чтобы их можно было работать более эффективно - это одно значение "света".

Если вы не преследуете экстремальные уровни производительности (как разработчики MongoDB, которые разрабатывали BSON), то я бы посоветовал использовать JSON - человеческая читаемость является большой выгодой для разработчика. До тех пор, пока вы используете библиотеку Jackson, переход на BSON позже не должен быть трудным - как вы можете видеть, насколько почти идентичны ваши собственные классы BSON и JSON.

Помните, что если размер проблемы, то как JSON, так и BSON должны хорошо сжиматься.

Ответ 2

Свойство "foo":"bar" потребляет 11 байтов в кодировке UTF-8 JSON. В BSON он потребляет 13:

bytes       description
============================================
1           entry type value \x02
3           "foo"
1           NUL \x00
4           int32 string length (4 -- includes the NUL)
3           "bar"
1           NUL \x00

Существует много случаев, когда JSON будет более компактным.