Eu sei que esta questão está um pouco datada neste momento ... Eu acho muito importante mencionar que depende da aparência do seu ambiente cliente / servidor.
Se você estiver passando bytes várias vezes sem inspeção, como um sistema de fila de mensagens ou entradas de log de streaming em disco, poderá preferir uma codificação binária para enfatizar o tamanho compacto. Caso contrário, é um problema caso a caso em diferentes ambientes.
Alguns ambientes podem ter serialização e desserialização muito rápidas de / para o msgpack / protobuf, outros nem tanto. Em geral, quanto mais baixo o nível do idioma / ambiente, melhor a serialização binária funcionará. Em idiomas de nível superior (node.js, .Net, JVM), você verá frequentemente que a serialização JSON é realmente mais rápida. A questão então é: a sobrecarga da sua rede é mais ou menos restrita que a sua memória / CPU?
No que diz respeito aos buffers msgpack vs bson vs protocol ... msgpack é o mínimo de bytes do grupo, sendo os buffers de protocolo os mesmos. O BSON define tipos nativos mais amplos que os outros dois e pode ser uma melhor correspondência para o modo de objeto, mas isso o torna mais detalhado. Os buffers de protocolo têm a vantagem de serem projetados para transmitir ... o que o torna um formato mais natural para um formato de transferência / armazenamento binário.
Pessoalmente, eu me inclinaria para a transparência que o JSON oferece diretamente, a menos que haja uma clara necessidade de tráfego mais leve. Sobre HTTP com dados compactados em gz, a diferença na sobrecarga da rede é ainda menos problemática entre os formatos.