Erro ao desserializar documento XML com XSD fortemente tipado

Estou com um problema bastante irritante ao tentar desserializar um documento XML específico usando o método XmlSerializer.Deserialize ().

Basicamente, eu tenho um XSD fortemente tipado com um elemento do tipo double. Ao tentar desserializar o elemento para um documento XML específico, recebo o habitual "System.FormatException: Input string não estava no formato correto". exceção porque nesse documento específico, o elemento não tem um valor.

Aqui está um código para você nerd por aí.

Documento XML de amostra:

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

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

Exemplo de código de desserialização:

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

Eu sei que a exceção de desserialização vem do fato de que uma cadeia vazia não pode ser convertida em dupla. Também sei que o valor padrão não está atribuído ao AverageSpeed porque, efetivamente, uma string vazia é um valor perfeitamente aceitável.

Existe uma maneira fácil de padronizar valores duplos para 0,0 (ou qualquer outro tipo) ao desserializar se um valor de string vazio for encontrado no documento XML? Idealmente, eu gostaria de evitar a implementação do ISerializable, porque realmente não sinto vontade de passar o resto do dia no poço do inferno (ou seja, implementando o ISerializable para cerca de cem classes).

Felicidades! Jean-Michel

questionAnswers(4)

yourAnswerToTheQuestion