title: .NET XML serialization gotchas?
body: <p>I've run into a few gotchas when doing C# XML serialization
  that I thought I'd share:</p>
  
  <ul>
  <li>You can't serialize items that are read-only (like KeyValuePairs)</li>
  <li>You can't serialize a generic dictionary. Instead, try this wrapper class (from <a href="http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx" rel="noreferrer">http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx</a>):</li>
  </ul>
  
  <hr/>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Text;
  using System.Xml.Serialization;
  
  [XmlRoot("dictionary")]
  public class SerializableDictionary&lt;TKey, TValue&gt; : Dictionary&lt;TKey, TValue&gt;, IXmlSerializable
  {      
      public System.Xml.Schema.XmlSchema GetSchema()
      {
          return null;
      }
  
      public void ReadXml(System.Xml.XmlReader reader)
      {
          XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
          XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
  
          bool wasEmpty = reader.IsEmptyElement;
          reader.Read();
  
          if (wasEmpty)
              return;
  
          while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
          {
              reader.ReadStartElement("item");
  
              reader.ReadStartElement("key");
              TKey key = (TKey)keySerializer.Deserialize(reader);
              reader.ReadEndElement();
  
              reader.ReadStartElement("value");
              TValue value = (TValue)valueSerializer.Deserialize(reader);
              reader.ReadEndElement();
  
              this.Add(key, value);
  
              reader.ReadEndElement();
              reader.MoveToContent();
          }
          reader.ReadEndElement();
      }
  
      public void WriteXml(System.Xml.XmlWriter writer)
      {
          XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
          XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
  
          foreach (TKey key in this.Keys)
          {
              writer.WriteStartElement("item");
  
              writer.WriteStartElement("key");
              keySerializer.Serialize(writer, key);
              writer.WriteEndElement();
  
              writer.WriteStartElement("value");
              TValue value = this[key];
              valueSerializer.Serialize(writer, value);
              writer.WriteEndElement();
  
              writer.WriteEndElement();
          }
      }
  }
  </code></pre>
  
  <p>Any other XML Serialization gotchas out there?</p>