2009-08-06 9 views
2

Ich möchte DateTime serialisieren, so dass, wenn DateTime null ist, ich nicht das Tag selbst bekomme.Serialize Complex Typ System.Nullable <System.DateTime>

Ich habe auch Bool für die oben genannten festgelegt, aber mein Problem ist DateTime von Werttyp ist es wird nie Null daher das Bool angegeben wird immer wahr für es.

Ich habe sogar versucht, DateTime zu System.Nullable zu ersetzen, aber ich bekomme Serialisierungsfehler beim Senden einer Anfrage oder beim Empfang einer Antwort von WebService.

Gibt es einen Ausweg?

Antwort

1

Sie müssen wahrscheinlich IXmlSerializable implementieren und Ihren Typ manuell serialisieren, dann können Sie den Nullable<DateTime> verwenden. Hier ein Beispiel:

public class MyData : IXmlSerializable 
{ 
    public Nullable<DateTime> MyDateTime { get; set; } 

    public void WriteXml(XmlWriter writer) 
    { 
     if (this.MyDateTime.HasValue) 
     { 
      writer.WriteStartElement("MyDateTime"); 
      writer.WriteValue((DateTime)this.MyDateTime); 
      writer.WriteEndElement(); 
     } 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     if (reader.ReadToDescendant("MyDateTime")) 
     { 
      this.MyDateTime = reader.ReadElementContentAsDateTime(); 
     } 
    } 

    public XmlSchema GetSchema() 
    { 
     return null; 
    } 
} 

Mit diesem:

MyData md = new MyData { MyDateTime = null }; 
XmlSerializer ser = new XmlSerializer(typeof(MyData)); 
using (var writer = XmlWriter.Create(@"d:\temp\test.xml")) 
{ 
    ser.Serialize(writer, md); 
} 

using (var reader = XmlReader.Create(@"d:\temp\test.xml")) 
{ 
    md = (MyData)ser.Deserialize(reader); 
    WL(md.MyDateTime.HasValue); 
} 

ändern, dass in erster Linie zum MyDateTime = DateTime.Now das alternativen Verhalten zu sehen. Dies schreibt und liest den Wert MyDateTime je nachdem, ob es in der XML vorhanden ist:

<?xml version="1.0" encoding="utf-8"?> 
<MyData /> 

<?xml version="1.0" encoding="utf-8"?> 
<MyData> 
    <MyDateTime>2009-08-06T10:10:14.8311049+01:00</MyDateTime> 
</MyData> 
+0

Können Sie es –

+0

Added ein Beispiel erarbeiten, scheint für mich arbeiten! Ich denke, das sollte auch für Ihr Webservice-Ergebnis funktionieren. –

4

Siehe this question, wo Marc eine ausgezeichnete Antwort gibt. Nur eine ShouldSerializeMyDateTime Methode Ihrer Klasse hinzufügen:

public bool ShouldSerializeMyDateTime() 
{ 
    return MyDateTime.HasValue; 
} 

Offenbar ist dies eine nicht dokumentierte Funktion von XML-Serialisierung ... Sie können auch eine Eigenschaft MyDateTimeSpecified namens

+0

Das funktioniert nicht: 'System.InvalidOperationException: IsNullable darf für einen Nullable -Typ nicht auf 'false' gesetzt werden. Erwägen Sie, 'System.DateTime' zu verwenden. –

+0

Siehe meine aktualisierte Antwort –

+0

Warum Sie die öffentliche Zeichenkette MyDateTimeXML() verwendet haben –

Verwandte Themen