views:

574

answers:

2

I'm getting a xml file from one vendor that has some "empty" dates like this:

<UpdatedOn/>
<DeletedOn/>

By doing a regular deserialization it fails with:

Inner Exception: System.FormatException: String was not recognized as a valid DateTime.

Any ideas how to deal with this ?

My fields are already marked for a default DateTime:

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

I'm assuming that the xml is actually something like <UpdatedOn/> / <DeletedOn/>? i.e. empty elements.

When non-standard formats are involved, one trick that works is to introduce your own shim property:

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

Here, the Foo.Bar property (the actual DateTime) isn't used during serialization; instead, the Foo.BarTransport property is serialized under the Bar element - but with special rules. You can replace DateTime.MinValue with any other value that you want to treat as the blank/default.

Note that if you don't want to send the Bar element at all, you can write a public bool ShouldSerializeBarTransport(), which XmlSerializer will check - if you return false, it won't get written.

Marc Gravell
thanks Marc, it's exactly what I wanted.The only thing I changed is the usage of another overload of XmlConvert.ToDateTime(string) as this one is obsolete.Thank you.
A: 

try to change the <UpdatedOn/> to <UpdatedOn xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> and you can deserialize the xml

Mark Henneman