I still have mixed feelings about Protobuf. Picking it to back our event bus and event store was still the right choice and I think it's still the thing I would pick again. But I still don't love it. The equivalence of zero value and null is a PITA that has caused a number of bugs. Working around this requires loading a lot of Google schemas and making everything structs. I know this and we do this. But it doesn't stop occasional bugs. And, it just feels like a big kludge to not have that be inherent in the encoding.