For the purposes of this thread, protocol buffers have three disadvantages:
- Duplicates data structure layout of a C/C++ data structure. You wind up encoding C/C++ data structure -> another C/C++ data structure. Python hides this from the programmer, but it is the same net result.
- Less flexible than JSON in describing dynamic, multi-dimensional data structures, because the structure of every data field is compiled into the application. Simple JSON is much more flexible, and data structures may be changed at will.
- Like current JSON, requires a native -> encoded -> native encoding for each miner client
Basically, any packetized protocol -- let us say JSON-over-TCP (rather than JSON-over-HTTP) -- requires some amount of low-level raw binary parsing to locate message boundaries. To simply pass through data unchanged, rather than decoding compressed JSON, comes for free in such protocols.
Therefore, logically, any JSON-over-TCP protocol already has the ability to skip the pointless native->encoded->native step that each miner client performs, by using this pass-through method. Passing raw binary work directly from bitcoind to the client eliminates the possibility of bugs and problems related to the unnecessary encoding+decoding an additional JSON step would require.