Упаковка набора boolean-флагов для сериализации, доработка Kryo

Для Reedy нам понадобилась эффективная сериализация, и наиболее подходящим вариантом оказался Kryo, кроме обычной автоматической обработки объектов, предоставляющий ещё и удобное API прямо поверх стандартных Java InputStream и OutputStream.

Kryo позволяет вручную сериализовать что угодно, оптимизируя по производительности или же по потреблению памяти. Int, Long и пр. можно записывать очень кратко, иногда ограничиваясь всего одним байтом. ASCII строки так же могут использовать один байт, вместо двух, на каждый символ. Отличным бонусом является то, что API достаточно изолировано от остальных классов библиотеки, и ProGuard без проблем может вырезать всё лишнее, сохраняя наше Android-приложение компактным.

Немного огорчил лишь один момент — boolean-флаги для обычной записи тоже требуют целый байт, а вариантов упаковки не предусмотрено. С одной стороны, конечно, понятно — байт минимальная единица адресации памяти, а упаковка немного замедляет работу. Однако когда флагов у нас несколько и элементов с флагами может быть много, это разрастание сериализованных данных начинает всё больше влиять на конечный размер данных. Так что было решено пожертвовать толикой производительности и несколько флагов упаковывать в биты одного числа. В нашем случае хватает как раз одного байта — флагов меньше восьми.

Читать далее »