Flatbuffers is pretty great, one side benefit of these types of technologies is you can also use them to structure your memory accesses.
I've done this in Java to do cache aware reading to pretty great success.
Do you mind elaborating?
I am not OP but I'm imagining data-oriented design. So like, things are structured and then serialized - and at some other end deserialized in place ready to read cache-coherently?
Yup pretty much. Zero-copy deserialization implies one large read into a block of memory(or mmap) which forces a specific layout. From there it's straightforward to follow standard data oriented design principals.