Я знаю, что этот вопрос немного устарел на данный момент ... Я думаю, что очень важно упомянуть, что это зависит от того, как выглядит ваша клиент-серверная среда.
Если вы передаете байты несколько раз без проверки, например, с помощью системы очереди сообщений или потоковой передачи записей журнала на диск, тогда вы можете предпочесть двоичную кодировку, чтобы подчеркнуть компактный размер. В противном случае это индивидуальная проблема с различными средами.
Некоторые среды могут иметь очень быструю сериализацию и десериализацию в / из msgpack / protobuf, другие не так много. В целом, чем ниже уровень языка / среды, тем лучше будет двоичная сериализация. В языках более высокого уровня (node.js, .Net, JVM) вы часто видите, что сериализация JSON на самом деле быстрее. Тогда возникает вопрос, является ли нагрузка на вашу сеть более или менее ограниченной, чем ваша память / процессор?
Что касается msgpack против bson против протокольных буферов ... msgpack - это наименьшее количество байтов в группе, причем протокольные буферы примерно одинаковы. BSON определяет более широкие собственные типы, чем два других, и может лучше соответствовать вашему объектному режиму, но это делает его более подробным. Буферы протокола имеют то преимущество, что они предназначены для потоковой передачи ... что делает их более естественным форматом для двоичного формата передачи / хранения.
Лично я бы склонялся к прозрачности, которую предлагает JSON напрямую, если только нет явной необходимости в меньшем трафике. По протоколу HTTP с сжатыми данными разница в затратах сети является еще меньшей проблемой между форматами.