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"?
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; }
}
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.
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); }
}