В protobuf, к примеру, не нужно хранить информацию о типах, она хранится в схеме (т.е. в парсере, а не самих данных), поэтому protobuf компактнее, чем форматы, хранящие информацию о типах (sqlite, message pack). Зато во втором случае можно работать с данными, не зная схемы или зная её лишь частично. Json - вообще текстовый формат, его могут читать и редактировать люди в обычном редакторе, зато он намного менее компактный, чем дaже message pack.
Форматов много потому что требования в разных задачах разные. Как вы всё это сможете совместить в одном формате?
Это всё уже продумано. В начале файла в единственном экземпляре очень компактно хранится информация о типах и всех структурах данных, либо указание имени внешнего модуля, в котором их нужно искать - то есть сам пользователь может сделать выбор, хранить схему в самом файле или отдельно. Дальше идёт несколько байт, которые говорят, что далее идёт экземпляр описанной структуры, после чего идут сырые и компактные данные без каких-либо метаданных внутри, упакованные в соответствии указанным типом.
Мой формат определён как в текстовом, так и в бинарном виде. Любой текст можно взаимно однозначно (плюс-минус форматирование и синтаксический сахар) перегнать в бинарный вариант и наоборот. Нужна человекочитаемость - конвертим в текст и работаем с ним. Нужна бинарность, компактность и скорость обработки - перегоняем в бинарь.
В общем, пользователь контролирует абсолютно всё, что хочет.