Je sais que cette question est un peu daté à ce point... je pense qu'il est très important de mentionner qu'il dépend de ce que votre environnement client/serveur.
Si vous êtes de passage octets à plusieurs reprises sans inspection, comme avec un message de système de file d'attente ou en streaming les entrées de journal sur le disque, puis vous peut très bien préférer un codage binaire pour souligner la taille compacte. Sinon c'est du cas par cas, un problème avec des environnements différents.
Certains environnements peuvent avoir très vite de sérialisation et de désérialisation vers/à partir de msgpack/protobuf, d'autres pas tellement. En général, le plus bas niveau de la langue et de l'environnement le mieux la sérialisation binaire de travail. Dans un langage de haut niveau (node.js, .Net, JVM) vous verrez souvent que la sérialisation JSON est effectivement plus rapide. La question devient alors est de votre réseau plus ou moins contraint que votre mémoire/cpu?
En ce qui concerne msgpack vs bfils vs protocol buffers... msgpack est le moins octets du groupe, protocol buffers être sur la même chose. BFILS définit de plusieurs grands types natifs que les deux autres, et peut-être mieux correspondre à votre mode de l'objet, mais cela le rend plus détaillé. Protocol buffers ont l'avantage d'être conçu pour les flux... ce qui en fait un de plus naturel pour le format d'un transfert binaire/format de stockage.
Personnellement, je pencherais vers la transparence que JSON offre directement, sauf s'il y a un besoin clair de trafic plus léger. Sur HTTP avec format de données, à la différence de la surcharge du réseau sont encore moins d'un problème entre les formats.