Sending packet-ized structs has worked pretty much flawlessly for me. The RadioHead Library does a lot of the heavy lifting. It takes a pointer to your data and a byte count. It then takes care of formatting packets with CRC, with encoding (if you like), sending them out, and then waiting for an acknowledgement (if you like). At the RX end, you just confirm the correct received byte count and then do a memcpy into your structure. Bam, your data is there in the exact format as on the transmit end.
You can define your payload struct to include as much extra redundancy and checking as you like. Put in a packet sequence number to determine if any packets have been dropped. Add an extra payload-only CRC to check for transmission errors. That’s way more assurance than you get blasting out ASCII strings. And, IMO, a much more elegant, solution.