web-dev-qa-db-fra.com

Empêcher la conversion de fuseau horaire lors de la désérialisation de la valeur DateTime

J'ai une classe que je sérialise/désérialise en utilisant XmlSerializer. Cette classe contient un champ DateTime.

Lorsqu'il est sérialisé, le champ DateTime est représenté par une chaîne qui inclut le décalage de GMT, par exemple 2010-05-05T09:13:45-05:00. Lorsqu'elles sont désérialisées, ces heures sont converties en heure locale de la machine effectuant la désérialisation.

Pour des raisons qui ne valent pas la peine d'être expliquées, j'aimerais empêcher cette conversion de fuseau horaire. La sérialisation se produit dans la nature, où plusieurs versions de cette classe existent. La désérialisation se produit sur un serveur sous mon contrôle. En tant que tel, il semble que ce serait mieux géré lors de la désérialisation.

Comment puis-je y arriver, à part implémenter IXmlSerializable et faire toute la désérialisation "à la main"?

28
Odrade

Au lieu d'analyser comme un DateTime, vous pouvez l'analyser comme un DateTimeOffset et utiliser le DateTimeOffset.DateTime propriété pour ignorer le fuseau horaire. Comme ça:

[XmlIgnore()]
public DateTime Time { get; set; }

[XmlElement(ElementName = "Time")]
public string XmlTime
{
    get { return XmlConvert.ToString(Time, XmlDateTimeSerializationMode.RoundtripKind); }
    set { Time = DateTimeOffset.Parse(value).DateTime; }
}
24
Adam Hughes

Ce que j'ai fait, c'était d'utiliser la méthode DateTime.SpecifyKind, comme suit:

DateTime dateTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified);

Et cela résout mon problème, j'espère que cela vous aidera.

29
Arvi

Pourriez-vous essayer quelque chose comme this post suggère et créer une nouvelle propriété de chaîne et XmlIgnore celle existante:

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

Ajoutez ensuite 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
SwDevMan81