I developed crunch to address some grievances I have with the interface design in these existing protocols. It has the following features: 1. Field and message level validation is required. What makes a field semantically correct in your program is baked into the C++ type system.
2. The serialization format is a plugin. You can choose read/write speed optimized serialization, a protobuf-esque tag-length-value format, or write your own.
3. Messages have integrity checks baked-in. CRC-16 or parity are shipped with Crunch, or you can write your own.
4. No dynamic memory allocation. Using template magic, Crunch calculates the worst-case length for all message types, for all serialization protocols, and exposes a constexpr API to create a buffer for serialization and deserialization.
I'm very happy with how it has turned out so far. I tried to make it super easy to use by providing bazel and cmake targets and extensive documentation. Future work involves automating cross-platform integration tests via QEMU, registering with as many package managers as I can, and creating bindings in other languages.
Hopefully Crunch can be useful in your project! I have written the first in a series of blog posts about the development of Crunch linked in my profile if you're interested!