Protocol Buffers are a way of serializing data with a predefined schema. It is a format developed by Google and used internally to communicate their services.
It is very small and very fast (up to 10 times) compared with the other serialization formats supported. However the server needs to know in advance the schema (i.e. the developer must share a .proto file).
You can use protocol buffers in combination of each protocol supported by thethings.iO (http/s, MQTT/s, CoAP ) to communicate your things with the cloud. For example, you can send protobuf with http just changing the body and doing the same api calls as you would do in JSON.
The .proto to be shared with thethings.iO has a predefined format with some customizable parts. The customizable parts are in Value.resource object where you define your resources/keys as you would do in JSON.
The thing is intended to send Query messages and the server will answer with Result messages.
Notice there aren't required fields, so it's easy to mantain backwards compatibility with your things if new features/resources are added.