I recently discovered the usefulness of msgpack with a fixed scheme. Wrote a library for encoding/decoding msgpack based on structs. Like protobuf, it's compact and possible to evolve, plus I actually find it easier to deal with, since it decodes to native types, not protobuf wrappers. And you can read it in basically any language, which makes is super easy to debugging binary files/streams.