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