Serialization usually impedes too much on performance for me to say I'd ever use it. If it's in a case where how fast it perms isn't significant (i.e. loading settings from a file) I'd advocate the use of serialization (in this case XML serialization because the XML-file format is extremely easy to edit).
Structures (with pointers) are nice and all (hell I use to abuse them all the time back a few years ago; just look at CSV2) however, they're not maintainable.
What I mean by that is writing code targeted at various versions of something requires the ability to be changed very easily with little to no effort. For example, say a parameter exists a new version of Conquer, but doesn't on an older version? In terms of a data structure if the user were to ever assign to this instance-member updating the code to the suitable version would become quite tedious. The second problem with this method is that it does not account for dynamic packets with variance in length (such as chat packets, synchoro/userattr packets, etc.)
Today, I utilize a method similar to that of a stream (essentially, a packet builder). You can compare the functions I use to that of BinaryWriter and BinaryReader, but obviously my implementation varies. I would not advocate the use of MemoryStream's with packets either if you thought that's where I was going.