The protobuf library is all about serialization of structured data, i.e. converting it to a bytestream or text and back. The .proto file describes the structure (the 'protocol') of the data to be serialized (it is not really a class, since it is only data, no methods, no behaviour; but your intention is right I guess). The protobuf compiler can turn this description into python/or C++/or Java code to serialize and deserialize data with that structure.
The actual data ("object" as you call it) can then be given in files with the extension .prototxt (actually the extension does not matter at all, it is just a text file), which can be read in using the protobuf compiler generated code to have the data in the specified structure in memory.
In protobuf there are two different formats for serialized data: textual or bytestream. The text format is human-readable and modifiable (and the corresponding files usually have the extension .prototxt), but it takes up a lot more space than the binary format.
In caffe, the network and solver definitions are nothing else but serialized-to-text data with the structure given in the caffe.proto. So if you ever have questions about a parameter,
this is where you should look first.
Jan