Forzar XmlSerializer para serializar DateTime como ‘AAAA-MM-DD hh: mm: ss’

Tengo un esquema XSD para algunos servicios RESTful. Cuando se utiliza junto con la herramienta xsd.exe para generar código C #, xs:date XSD genera el siguiente código:

 [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="date")] public System.DateTime time { get { return this.timeField; } set { this.timeField = value; } } 

Al deserializar XML a objetos usando XmlSerializer todo parece estar bien. El problema al que me enfrento es que el servicio espera que las fechas se formateen como YYYY-MM-DD hh:mm:ss y el código generado por XSD parezca producir solo YYYY-MM-DD .

Si modifico XSD manualmente a xs:dateTime tipo de fecha y xs:dateTime , el código generado C # produce: 2010-08-20T20:07:03.915039Z .

Básicamente, ¿cómo fuerzo la serialización para producir YYYY-MM-DD hh:mm:ss ? ¿Hay algo que hacer con XSD o hay algo que pueda hacer para alterar el código de C # generado?

En el pasado, hice lo siguiente para controlar la serialización de fecha y hora:

  • Ignore la propiedad DateTime.
  • Crea una propiedad de cadena ficticia que serializa / deserializa de la manera que yo quiero

Aquí hay un ejemplo:

 public class SomeClass { [XmlIgnore] public DateTime SomeDate { get; set; } [XmlElement("SomeDate")] public string SomeDateString { get { return this.SomeDate.ToString("yyyy-MM-dd HH:mm:ss"); } set { this.SomeDate = DateTime.Parse(value); } } } 

Utilice el [XmlElement(DataType = "date")] para formatear el valor de su propiedad DateTime según lo necesite.

Desde MSDN :

Nota:
El atributo que anota el campo de fecha de publicación tiene una propiedad DataType. No hay ningún tipo en .NET Framework que coincida con el tipo xs: date completamente. La coincidencia más cercana es System.DateTime, que almacena datos de fecha y hora. Al especificar la propiedad DataType como una “fecha”, se garantiza que XmlSerializer solo serializará la parte de la fecha del objeto DateTime.

Creo que la implementación de la interfaz IXmlSerializable hará un truco. Luego puede controlar cómo serializa y deserializa su objeto.

Si solo necesita borrar la parte en milisegundos. Referirse a:

Cómo truncar milisegundos fuera de un .NET DateTime

Y básicamente, haz algo como:

  startDateTimeToUse = startDateTimeToUse.AddTicks(-(startDateTimeToUse.Ticks % TimeSpan.TicksPerSecond)); endDate = endDate.AddTicks(-(endDate.Ticks % TimeSpan.TicksPerSecond)); 

Puedo confirmar que esto se serializa a:

  2015-10-31T12:13:04 2016-11-10T12:13:06 

Debo también decir que antes de borrar los milisegundos, estoy haciendo esto:

  var startDateTimeToUse = ssStartDateTime.ToUniversalTime(); var endDate = DateTime.Now.ToUniversalTime(); startDateTimeToUse = DateTime.SpecifyKind(startDateTimeToUse, DateTimeKind.Unspecified); endDate = DateTime.SpecifyKind(endDate, DateTimeKind.Unspecified); 

Que no sé si está teniendo algún efecto en la serialización o no en este punto