A neat trick could be serializing the ```Descriptor``` for the protocol buffer message -- itself a well-known protobuf (https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/Descriptors.Descriptor). This would allow one to have reflection-based access to the messages without having the actual compiled protobuf class.
```getFullName``` on said descriptor would return the class, so we could check in the beginning if we have the actual compiled class, and only fall back to reflection.

I would suggest doing the first part of that -- serializing the descriptor -- now, but leaving the ability to use protobuf via reflection on the descriptor for later, as it's a lot of work and what you have so far is already likely to be super useful.