XML десериализация даты с пустым значением - PullRequest
8 голосов
/ 08 мая 2009

Я получаю XML-файл от одного поставщика, у которого есть несколько «пустых» дат, таких как:

<UpdatedOn/>
<DeletedOn/>

При регулярной десериализации происходит сбой:

Внутреннее исключение: System.FormatException: строка не была распознана как допустимый DateTime.

Есть идеи, как с этим бороться?

Мои поля уже помечены для использования по умолчанию DateTime:

[System.Xml.Serialization.XmlElementAttribute(DataType="date")]
[System.ComponentModel.DefaultValueAttribute(typeof(System.DateTime), "1901-01-01")]
public System.DateTime UpdateOn{...}

Ответы [ 2 ]

13 голосов
/ 08 мая 2009

Я предполагаю, что xml на самом деле что-то вроде <UpdatedOn/> / <DeletedOn/>? т.е. пустые элементы.

Когда задействованы нестандартные форматы, одна хитрость заключается в том, чтобы ввести собственное свойство shim:

[Serializable]
public class Foo {
    [XmlIgnore]
    public DateTime Bar { get; set; }

    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    [XmlElement("Bar")]
    public string BarTransport {
        get {
            return Bar == DateTime.MinValue ? "" : XmlConvert.ToString(Bar);
        }
        set {
            Bar = string.IsNullOrEmpty(value) ? DateTime.MinValue
                : XmlConvert.ToDateTime(value);
        }
    }
}

Здесь свойство Foo.Bar (фактическое DateTime) не используется во время сериализации; вместо этого свойство Foo.BarTransport сериализуется под элементом Bar, но со специальными правилами. Вы можете заменить DateTime.MinValue любым другим значением, которое вы хотите считать пустым / значением по умолчанию.

Обратите внимание, что если вы вообще не хотите отправлять элемент Bar, вы можете написать public bool ShouldSerializeBarTransport(), который XmlSerializer проверит - если вы вернете false, он не будет записан.

0 голосов
/ 01 июля 2010

Попробуйте изменить <UpdatedOn/> на <UpdatedOn xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />, и вы сможете десериализовать XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...