Alberth said:
If you don't know, chances are you invent a format that looks good on paper but it difficult or even impossible to implement.
Or the reverse, a format that is just a dump of what you happen to have in memory at the time which is completely brittle and breaks every time you think of something new.
I've worked on plenty of programs where that was exactly the case. Effectively C code in the format of:
ASSERT( file_size == sizeof mystruct);
size_t items_read = fread( the_thing, sizeof mystruct, 1, the_file);
ASSERT( items_read == 1);
There are a few scenarios where that is great, and in fact exactly the reason the C functions fread() and fwrite() take both a size and a count so you can read and write arrays. But when it comes to designing a robust format, that's coming at it in the wrong direction.