2009-08-06 4 views
2

Я хочу сериализовать DateTime так, чтобы, когда DateTime имеет значение null, я не получаю сам тег.Serialize Complex Type System.Nullable <System.DateTime>

Я также установил bool, указанный для вышеуказанного, но моя проблема заключается в том, что DateTime имеет тип значения, он никогда не будет равен нулю, поэтому указанный bool всегда будет правдой для него.

Я даже попытался заменить DateTime на System.Nullable, но получаю сообщение об ошибке Serialization при отправке запроса или получении ответа от WebService.

Есть ли выход?

ответ

1

Возможно, вам понадобится реализовать IXmlSerializable и вы можете вручную сериализовать свой тип, тогда вы сможете использовать Nullable<DateTime>. Вот пример:

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

Используя это:

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

Изменение, что первая линия MyDateTime = DateTime.Now, чтобы увидеть альтернативное поведение. Об этом пишет и читает значение MyDateTime в зависимости от того, является ли он присутствует в XML:

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

Вы можете уточнить это более – 2009-08-06 08:47:24

+0

Добавлено пример, кажется, работать на меня! Я думаю, что это тоже должно работать для вашего веб-сервиса. –

4

См this question, где Марк дает отличный ответ. Просто добавьте метод ShouldSerializeMyDateTime к классу:

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

Видимо, это недокументированная особенность XML сериализации ... Вы можете также использовать свойство с именем MyDateTimeSpecified

+0

Это не работает: 'System.InvalidOperationException: IsNullable не может быть установлен в 'false' для типа Nullable . Подумайте об использовании «System.DateTime». –

+0

см. Мой обновленный ответ –

+0

Почему вы использовали общедоступную строку MyDateTimeXML() – 2009-08-06 12:27:57

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