2008-09-19 5 views
11

J'ai créé un fichier de classe C# en utilisant un fichier XSD comme entrée. L'une de mes propriétés ressemblent à ceci:Sérialisation DateTime à heure sans millisecondes et gmt

private System.DateTime timeField; 

[System.Xml.Serialization.XmlElementAttribute(DataType="time")] 
public System.DateTime Time { 
    get { 
     return this.timeField; 
    } 
    set { 
     this.timeField = value; 
    } 
} 

Lorsque sérialisé, le contenu du fichier ressemble maintenant à ceci:

<Time>14:04:02.1661975+02:00</Time> 

Est-il possible, avec XmlAttributes sur la propriété, de l'avoir rendu sans les millisecondes et la valeur GMT comme ça?

<Time>14:04:02</Time> 

Est-ce possible, ou ai-je besoin de pirater ensemble une sorte de xsl/XPath remplacer la magie après la classe a été publié en feuilleton?

Ce n'est pas une solution de changer l'objet en chaîne, car il est utilisé comme un DateTime dans le reste de l'application et nous permet de créer une représentation XML à partir d'un objet en utilisant la méthode XmlSerializer.Serialize() .

La raison pour laquelle je dois retirer les informations supplémentaires du champ est que le système de réception n'est pas conforme aux normes w3c pour le type de données de temps.

+0

Regardez http://stackoverflow.com/questions/3534525/force-xmlserializer-to-serialize-datetime-as-yyyy-mm-dd-hhmmss – TNT

Répondre

13

Vous pouvez créer une propriété de chaîne qui effectue la traduction vers/depuis votre champ timeField et placez l'attribut serialization sur cette propriété à la place de la propriété DateTime réelle utilisée par le reste de l'application.

+0

Je devais faire exactement la même chose aujourd'hui :) – leppie

+0

Cela fonctionnera-t-il aussi si nous devons désérialiser le même fichier plus tard? – Espo

+0

Espo: oui ça va, voir le code dans ma réponse :) –

21

Mettez [XmlIgnore] sur la propriété Time.

Puis ajouter une nouvelle propriété:

[XmlElement(DataType="string",ElementName="Time")] 
public String TimeString 
{ 
    get { return this.timeField.ToString("yyyy-MM-dd"); } 
    set { this.timeField = DateTime.ParseExact(value, "yyyy-MM-dd", CultureInfo.InvariantCulture); } 
} 
+2

Est-ce que "aaaa-MM-jj" est la bonne chaîne de format pour un champ de temps? Bien que cette solution ne fonctionne pas pour moi hors de la boîte, elle m'a conduit à un qui a fait. J'ai dû utiliser '" HH: mm: ss "', et je suis originaire de mon 'dateField' comme ceci' get {return this.dateField.ToString ("HH: mm: ss"); } ' – OutstandingBill

Questions connexes