I have been working with the XmlSerialization stack on and off for about 2 years now. My first introduction to it was at DevelopMentor's Guerilla .NET @ Microsoft course back in November 2001. I had used it for trivial serialization tasks and as a simple topic for presentations that I gave internally for other consultants and at Microsoft DevCare. It was a straight forward, simple way to serialize object graphs to a human readable format (Xml).
Though useful, it was rigid and didn't always meet my requirements. In those instances I took advantage of the more robust System.Runtime.Serialization stack. After all, that stack supported private/public field serialization, highly customizable output through custom formatters and had a higher type fidelity. In addition, I could supply serialization for types that were not marked [Serializable] (through the ISerializationSurrogate).
It wasn't until the last couple of months that I really discovered that the System.Xml.Serialization stack was more flexible then I had originally thought. I stumbled across the flexibility when I was trying to emulate the ISerializable interface found in the System.Runtime.Serialization stack for an extended XmlSerializer class I was implementing to address some the original stack's short comings. I had tried implementing ISerializable on my class, then serializing it using the XmlSerializer, but none of the interface methods were called. By chance I created a IXmlSerializable interface... when I compiled, it failed indicating that the interface already existed. When I read the API docks on it, it was exactly what I was trying to implement. Prior to that I thought the System.Xml.Serialization stack was limited to a number of attributes (XmlAttribute, XmlElementAttribute, XmlIgnore, XmlArray, etc) used to describe how/what you wanted the XmlSerializer to serialize in your object graph.
What I discovered through the research is that there was more flexibility with the System.Xml.XmlSerializer then initially thought. By implementing IXmlSerializable in my classes, I could not only control how I formatted my Xml, but I could also serialize private members. Though it is a bit more work, because you must supply the implementation for not only writing the object to an XmlWriter, but also supply an implementation using the XmlReader to hydrate your object. IXmlSerializable is the equivalent to ISerializable in the System.Runtime.Serialization stack.
Granted this still doesn't give you the power that the System.Runtime.Serialization stack supplies, but it does open the door for additional implementations that may have been overlooked in the past.