Если я правильно понял вопрос, биты являются случайными, и у нас есть список произвольной длины независимо друг от друга. Поскольку байты не имеют ничего общего, я буду обсуждать это как поток битов. Поскольку файлы на самом деле содержат байты, вам нужно будет упаковать восемь битов на каждый байт и оставить 0,7 бита последнего байта неиспользованными.
Самый эффективный способ хранения логических значений - это как есть. Просто выведите их в битовый поток в виде простого массива.
В начале битового потока вам необходимо закодировать длины массива. Есть много способов сделать это, и вы можете сэкономить несколько бит, выбрав наиболее оптимальный для ваших массивов. Для этого вы, вероятно, захотите использовать кодирование Хаффмана с фиксированной кодовой книгой, чтобы обычно используемые и маленькие значения получали самые короткие последовательности. Если список очень длинный, вы, вероятно, не будете сильно заботиться о размере, который будет закодирован в более длинной форме.
Точный ответ относительно того, какой будет кодовая книга (и, следовательно, код Хаффмана), не может быть дан без дополнительной информации об ожидаемых длинах списка.
Если все внутренние списки имеют одинаковый размер (т. Е. У вас есть двумерный массив), вам, конечно, нужны только два измерения.
Десериализация: декодировать длины и распределять структуры, затем считывать биты один за другим, назначая их структуре по порядку.