Error al deserializar documento XML con XSD fuertemente tipado

Me encuentro con un problema bastante molesto al intentar deserializar un documento XML específico utilizando el método XmlSerializer.Deserialize ().

Básicamente, tengo un XSD fuertemente tipado con un elemento de tipo double. Cuando trato de deserializar el elemento para un documento XML específico, obtengo el habitual "System.FormatException: la cadena de entrada no tenía el formato correcto". excepción porque en ese documento específico, el elemento no tiene un valor.

Aquí hay un código para tus nerds.

Documento XML de muestra:

<TrackInfo>
  <Name>Barcelona</Name>
  <Length>4591</Length>
  <AverageSpeed />
</TrackInfo>

XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="TrackInfo">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Name" type="xs:string" />
      <xs:element name="Length" type="xs:double" default="0.0" />
      <xs:element name="AverageSpeed" type="xs:double" default="0.0" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

Clase TrackInfo:

[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
  { ... }
}

Código de deserialización de muestra:

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);

Sé que la excepción de deserialización proviene del hecho de que una cadena vacía no se puede convertir en un doble. También sé que el valor predeterminado no está asignado a AverageSpeed porque, efectivamente, una cadena vacía es un valor perfectamente aceptable.

¿Hay una manera fácil de predeterminar los valores dobles a 0.0 (o cualquier otro tipo) al deserializar si se encuentra un valor de cadena vacío en el documento XML? Idealmente, me gustaría evitar implementar ISerializable porque realmente no tengo ganas de pasar el resto del día en el pozo del infierno (es decir, implementar ISerializable durante aproximadamente cien clases).

¡Salud! Jean-Michel

Respuestas a la pregunta(4)

Su respuesta a la pregunta