Look into serialization in .NET, either using the System.Runtime.Serialization namespace elements, or the System.Xml.Serialization namespace elements. The first is true serialization and can handle cirucular references, as well as be easily controlled by implementing ISerializable. All that is required to serialize a Type is attribute it with the SerializableAttribute (put [Serializable] on the class definition). See the .NET Framework SDK documentation for more details, or search this site for plenty of examples (or google). If a Type isn't serializable and you can't / don't want to extend it and attribute it / customize serialization, you can use an ISerializationSurrogate to serialization the Type. You can also fix-up data after serialization is completely by having your object implement IDeserializationCallback. You can serializate to XML (SOAP) or binary with the default formatters. More might exist, or you can (though not recommended, especially without knowing the internals of serialization) implement your own formatter. XML Serialization, in contrast, using simple attributes and serialization to XML the way you define, unlike SOAP serialization above that would be pretty much unreadable to most people. XML serialization is limited however. You're not technically supposed to be able to control it as much, but you can implement the undocumented IXmlSerializable interface to serialization Types without XML Serialization attributes. This can serialize "prettier" documents, but doesn't have near the capabilities (like handling cirucular references).
-----BEGIN GEEK CODE BLOCK----- Version: 3.21 GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++ -----END GEEK CODE BLOCK-----