2009-08-06 12 views
1

Est-il possible de définir comment un DateTime doit être sérialisé/désérialisé en utilisant quelque chose de similaire à la balise XmlAttribute? Dans le passé, je voudrais faire le champ une chaîne, puis faire quelque chose comme ça dans le constructeur:Comment marquer un attribut XML DateTime avec XmlDateTimeSerializationMode?

this.DateField = XmlConvert.ToString(passedObject.Date, XmlDateTimeSerializationMode.Utc); 

Cependant, je voudrais avoir fait le champ soit un DateTime et marquer en quelque sorte qu'il devrait être publié en feuilleton comme UTC:

[System.Xml.Serialization.XmlAttribute()] // XmlDateTimeSerializationMode tag here? 
public DateTime DateField; 

Comment est-ce que je ferais cela?

+0

J'ai eu un problème avec les dates n'étant pas sérialisées en tant que Zulu (UTC) et c'était parce que les dates étaient _NOT_ UTC, même si je pensais qu'ils étaient. Vérifiez votre code à nouveau! Vous avez manqué certains appels SpecifyKind (..., ... UTC) nécessaires. (Juste une note pour la prochaine personne qui ne peut pas obtenir Z à virer à la fin de leurs dates sérialisées XML.) –

+0

@ Mark Hurd Juste pour clarifier. Si j'utilise * XmlSerializer * pour désérialiser XML et que les valeurs * xs: dateTime * sont ajoutées au fichier XML, les propriétés * DateTime * auront leurs propriétés * DateTime.Kind * définies sur * DateTimeKind. Utc. * Est-ce correct? – RunnerRick

+0

@RickRoth Je l'espère, mais je ne sais pas - notre application ne l'utilisait que pour la sérialisation. –

Répondre

1

Je ne suis pas sûr que vous puissiez le faire via les attributs, comme le passage de la ligne de la sérialisation de vos données telles qu'elles sont, à la transformer, puis à la sérialisation.

Vous pourriez peut-être obtenir le même résultat en changeant la façon dont vous représentez les données, en ajoutant une UTC propriété protégée, à savoir:

public DateTime DateField; 

[System.Xml.Serialization.XmlAttribute("DateField")] 
protected DateTime UtcDateField 
{ 
    get 
    { 
     //Convert DateField to UTC 
    } 

    set 
    { 
     DateField = //Convert value from UTC 
    } 
} 
+0

Merci Matt! En fait, j'ai fini par devoir ajouter un attribut XmlIgnore au réel DateField, sinon il le sérialiserait en tant qu'élément. –

0

Une autre option est d'hériter de l'interface IXmlSerializable et gérer toute la lecture et écriture de votre sérialisation manuellement. Ce n'est pas aussi succinct ou automatique que les attributs, mais cela vous donnera le contrôle dont vous avez besoin et je pense que c'est plus facile à comprendre que de créer des champs formatés spéciaux juste pour le processus de sérialisation.

Questions connexes