Force XmlSerializer à sérialiser DateTime en ‘AAAA-MM-JJ hh: mm: ss’

J’ai un schéma XSD pour un service RESTful. Lorsqu’il est utilisé avec l’outil xsd.exe pour générer du code C #, xs:date de XSD génère le code suivant:

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

Lors de la désérialisation de XML en objects utilisant XmlSerializer tout semble bien se passer. Le problème auquel je suis confronté est que le service s’attend à ce que les dates soient formatées comme YYYY-MM-DD hh:mm:ss et que le code généré par XSD semble ne produire que YYYY-MM-DD .

Si je modifie manuellement XSD en type xs:dateTime , le code C # généré produit: 2010-08-20T20:07:03.915039Z .

En gros, comment forcer la sérialisation à produire YYYY-MM-DD hh:mm:ss ? Y at-il quelque chose à faire pour XSD ou y a-t-il quelque chose que je peux faire pour modifier le code C # généré?

Dans le passé, j’ai fait ce qui suit pour contrôler la sérialisation de datetime:

  • Ignorer la propriété DateTime.
  • Créez une propriété de chaîne factice qui sérialise / désérialise comme je le souhaite

Voici un exemple:

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

Utilisez l’ [XmlElement(DataType = "date")] pour formater votre valeur de propriété DateTime selon vos besoins.

De MSDN :

Remarque:
L’atsortingbut qui annote le champ publicationdate a une propriété DataType. Il n’y a aucun type dans le .NET Framework qui correspond au type xs: date complètement. La correspondance la plus proche est System.DateTime, qui stocke les données de date et d’heure. La spécification de la propriété DataType en tant que “date” garantit que XmlSerializer sérialisera uniquement la partie date de l’object DateTime.

Je pense que l’implémentation de l’interface IXmlSerializable fera l’affaire. Vous pouvez ensuite contrôler la façon dont vous sérialisez et désérialisez votre object.

Si vous avez seulement besoin d’effacer la partie milliseconde. Faire référence à:

Comment tronquer les millisecondes d’un .NET DateTime

Et fondamentalement faire quelque chose comme:

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

Je peux confirmer que cela se sérialise à:

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

Je dois également préciser qu’avant d’ effacer les millisecondes, je fais ceci:

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

Ce que je ne sais pas si cela a un effet sur la sérialisation ou pas à ce stade