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