Вы можете взглянуть на Universal Binary JSON specification. Он не будет столь же компактным, как Smile, потому что он не ссылается на имена, но на 100% совместим с JSON (где BSON и BJSON определяют структуры данных, которых нет в JSON, поэтому нет стандартного преобразования в/из).
Это также (преднамеренно) преступно просто читать и писать со стандартным форматом:
[type, 1-byte char]([length, 4-byte int32])([data])
Так простые типы данных начинаются с кодом ASCII маркера, как «Я» для 32-битного междунар, 'T' для true, 'Z' для null, 'S' для строки и так далее.
Формат разработан с учетом требований к быстрому считыванию, поскольку все структуры данных имеют префикс их размера, поэтому нет сканирования для последовательностей с нулевым завершением.
Например, чтение строки, которая может быть отграничена, как это ([] -chars только для целей иллюстрации, они не записаны в формате)
[S][512][this is a really long 512-byte UTF-8 string....]
Вы видели бы «S» , включите его для обработки строки, см. 4-байтовое целое, которое следует за ним «512», и знайте, что вы можете просто захватить в одном фрагменте следующие 512 байт и декодировать их обратно в строку.
Аналогично числовые значения выписываются без значения длины, чтобы быть более компактными, поскольку их тип (байты, int32, int64, double) определяет длину байтов (1, 4, 8 и 8. соответственно). для сколь угодно больших чисел, которые чрезвычайно переносимы, даже на платформах, которые их не поддерживают).
В среднем вы должны увидеть уменьшение размера примерно на 30% с помощью хорошо сбалансированного объекта JSON (много смешанных типов). Если вы хотите точно знать, как некоторые структуры сжимают или не сжимают, вы можете проверить раздел Size Requirements, чтобы получить представление.
С яркой стороны, независимо от сжатия, данные будут записываться в более оптимизированном формате и работать быстрее.
Я проверил ядро Input/OutputStream implementations для чтения/записи формата в GitHub сегодня. На этой неделе я буду проверять общее отображение объектов на основе отражения.
Вы можете просто посмотреть на эти два класса, чтобы посмотреть, как читать и писать формат, я думаю, что основная логика - это что-то вроде 20 строк кода. Классы более длинны из-за абстракций к методам и некоторого структурирования вокруг проверки байтов маркера, чтобы убедиться, что файл данных является допустимым форматом; такие вещи.
Если у вас есть конкретные вопросы, такие как спецификация (большой) спецификационного или числового формата для парных разрядов (IEEE 754), все это описано в спецификации или просто спросите меня.
Надеюсь, что это поможет!
Почему вы не можете использовать сжатие на сервере? – Andrey
Спецификации BSON далеко не оптимальны как по размеру, так и по эффективности. Возможно, вам стоит рассмотреть возможность хранения сжатого JSON (с дефлятом или что-то еще). – arthurprs
@ Андрей может быть возможным решением, но я хочу посмотреть, есть ли способ уменьшить количество данных, которые мы кормим, в базовый поток (который уже имеет возможность делать сжатие «на лету»). в теории, это должно быть проще сжать его на уровне кодирования объекта, так как у нас есть контекст о тегах и т. д. –