I ve been looking at this for a while now
It seems that binary serialisation is discouraged as any change to field names breaks serialisation =? Not Good
XMLSerializer is problematic because you have to provide a no arg constructor and public fields although you do have more control over elements being attributes or elements and their naming
DataContractSerializer is good but all suclassses need to be explicitly added which is a shame
However I stumbled across NetDataContractSerializer which does not have this limitation.
If your goal is C# serialisation and no big constraints on size of xml is NetDataContractSerializer always the way to go here??
Dan Rigsby has a really good comparative article on XmlSerializer vs. DataContractSerializer and also touches on the NetDataContractSerializer.
DataContractSerializer:
You tell the DCS explicitly what to serialize, but you don't have much influence over how it's done.
XmlSerializer
You tell the XmlSerializer pretty clearly how and what to serialize, but you cannot serialize everything - only publicly visible properties.
The NetDataContractSerializer is a bit of an oddity - it's not interoperable, it works only if both ends are .NET - it includes .NET type information into the message (making it bigger). You cannot add it declaratively to a WCF service "out of the box".
It's a tough trade-off - as always. Definitely stay away from any binary formatter - that's not backwards compatible, brittle, and bound to give you headaches - use one of those standard ways of doing it. Which one is the "best" for your given scenario is really hard to tell - you'll have to figure that one out for yourself....