title: Error deserialising XML document with strongly typed XSD
body: <p>I am running into quite an annoying issue while trying to deserialise a specific XML document using XmlSerializer.Deserialize() method. </p>
  
  <p>Basically, I have a strongly typed XSD with an element of type double. When trying to deserialise the element for a specific XML document, I get the usual "System.FormatException: Input string was not in a correct format." exception because in that specific document, the element does not have a value.</p>
  
  <p>Here is some code for you nerds out there.</p>
  
  <p><strong>Sample XML document:</strong></p>
  
  <pre><code>&lt;TrackInfo&gt;
    &lt;Name&gt;Barcelona&lt;/Name&gt;
    &lt;Length&gt;4591&lt;/Length&gt;
    &lt;AverageSpeed /&gt;
  &lt;/TrackInfo&gt;
  </code></pre>
  
  <p><strong>XSD:</strong></p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"&gt;
  &lt;xs:element name="TrackInfo"&gt;
    &lt;xs:complexType&gt;
      &lt;xs:sequence&gt;
        &lt;xs:element name="Name" type="xs:string" /&gt;
        &lt;xs:element name="Length" type="xs:double" default="0.0" /&gt;
        &lt;xs:element name="AverageSpeed" type="xs:double" default="0.0" /&gt;
      &lt;/xs:sequence&gt;
    &lt;/xs:complexType&gt;
  &lt;/xs:element&gt;
  </code></pre>
  
  <p></p>
  
  <p><strong>TrackInfo class:</strong></p>
  
  <pre><code>[Serializable]
  public class TrackInfo
  {
    private string name = string.Empty;
    private double length = 0.0;
    private double averageSpeed = 0.0;
  
    [XmlElement]
    public string Name
    { ... }
  
    [XmlElement]
    public double Length
    { ... }
  
    [XmlElement]
    public double AverageSpeed
    { ... }
  }
  </code></pre>
  
  <p><strong>Sample deserialisation code:</strong>  </p>
  
  <pre><code>XmlDocument xmlDocument = new XmlDocument();
  xmlDocument.Load("TrackInfo.xml");
  
  // Deserialise XML string into TrackInfo object
  byte[] buffer = ASCIIEncoding.UTF8.GetBytes(xmlDocument.InnerXml);
  MemoryStream stream = new MemoryStream(buffer);
  System.Xml.XmlReader reader = new System.Xml.XmlTextReader(stream);
  
  XmlSerializer xSerializer = new System.Xml.Serialization.XmlSerializer(typeof(TrackInfo));
  TrackInfo trackInfo = (TrackInfo)xSerializer.Deserialize(reader);
  </code></pre>
  
  <p>I know that the deserialisation exception comes from the fact that an empty string cannot be converted to a double. I also know that the default value is not assigned to AverageSpeed because, effectively, an empty string is a perfectly acceptable value.</p>
  
  <p>Is there an easy way to default double values to 0.0 (or any other type) when deserialising if an empty string value is found in the XML document? 
  Ideally, I would like to avoid implementing ISerializable because I don't really feel like spending the rest of the day into the burning pit of hell (i.e. implementing ISerializable for about a hundred classes).</p>
  
  <p>Cheers!
  Jean-Michel</p>