2013-03-28 2 views
4

Я десериализации следующий XML:Лучшие практики для десериализации обнуляемых типов

<Root> 
    <Order> 
     <Id>12</Id> 
     <Date>2013-03-28T16:12:45</Date> 
     <Number></Number> 
     <Amount></Amount> 
    </Order> 
</Root> 

Мой класс похож на это:

[XmlType("Order")] 
    public class ImportOrder 
    { 
     [XmlElement("Id")] 
     public int OrderId { get; set; } 

     [XmlElement("Date")] 
     public DateTime OrderDate { get; set; } 

     [XmlElement("Number")] 
     public string OrderNumber { get; set; } 

     [XmlElement("Amount", IsNullable = true)] 
     public decimal? OrderAmount { get; set; } 
    } 

десериализатор я использую:

 public List<T> DeserializeList<T>(string filePath, string rootName) 
     { 
      var itemList = new List<T>(); 

      if (File.Exists(filePath)) 
      { 
       var serializer = new XmlSerializer(typeof(List<T>), new XmlRootAttribute(rootName)); 
       TextReader reader = new StreamReader(filePath); 
       itemList = (List<T>)serializer.Deserialize(reader); 
       reader.Close(); 
      } 

      return itemList; 
     } 

Он отлично работает, когда все данные заполняются в xml. Если Number пуст, все в порядке. Но когда Amount пусто я получаю исключение:

Input string was not in a correct format. 

Это потому, что вы не можете просто десериализации обнуляемых типов. Я нашел несколько решений в Интернете, чтобы решить эту проблему. Но они выглядят не очень хорошо, и для этого вам нужно написать много кода.

Есть ли элегантное решение? Каковы наилучшие методы десериализации типов NULL?

+2

Посмотрите на этот вопрос - http://stackoverflow.com/questions/3250706/xmlserializer-and-nullable-attributes - ответ о внедрении IXmlSerializable и сделайте это самостоятельно – Axarydax

+0

@Axarydax, я должен согласиться с этим, это эффективно единственный путь. –

ответ

0

Есть ли конкретная необходимость иметь XML в том виде, в котором у вас есть это прямо там?

Я спрашиваю об этом, потому что, если вы уже говорите десериализатору XML, что элемент Amount имеет значение NULL, это означает, что этот элемент может существовать или нет. Поэтому, если вы генерируете XML, вам нужно только избежать создания этого элемента, и вы готовы к работе.

Вы можете видеть, что если у вас есть файл, как это:

<Root> 
    <Order> 
     <Id>12</Id> 
     <Date>2013-03-28T16:12:45</Date> 
     <Number></Number> 
    </Order> 
</Root> 

И вы разобрать его с кодом он будет работать.

+1

Нет, вход xml всегда имеет тег , но иногда это emty. Использование IsNullable Я только что попытался решить свою проблему. – algreat

Смежные вопросы