Essentially, this system works great if you know the exact hardware and compiler toolchain, and you never expect to upgrade it with things that might break memory layout. Obviously this does not hold for Word: it was written originally in a 32-bit world and now we live in a 64-bit one, MSVC has been upgraded many times, etc. There's also address space concern: if you embed your pointers, are you SURE that you're always going to be able to load them in the same place in the address space?
The overhead of deserialization is very small with a properly written file format, it's nowhere near worth the sacrifice in portability. This is not why Word is slow.
And then you have things like cap'n'proto if you want to control your memory layout. [1]
But for "productivity" files, you are essentially right. Portability and simplicity of the format is probably what matters.
[0]: https://www.hytradboi.com/2025/05c72e39-c07e-41bc-ac40-85e83...
That's exactly the point!
(For example, if Rust would detect a version change, it could rewrite the data into a compatible format, etc.)
The reason I hated it though was because it was very hard to version. I know the Word team had that problem, especially when the mandate came down for older versions to be able to read newer versions. Hard enough to organize the disk format so old versions can ignore stuff, but now you're putting the same requirements on the in-memory representation. Maybe Word did it better.