XmlSerializer
を使用してシリアル化/逆シリアル化するクラスがあります。このクラスにはDateTime
フィールドが含まれています。
シリアル化すると、DateTime
フィールドはGMTからのオフセットを含む文字列で表されます。例:2010-05-05T09:13:45-05:00
。逆シリアル化されると、これらの時間は、逆シリアル化を実行するマシンのローカル時間に変換されます。
説明する価値がない理由で、私はこのタイムゾーンの変換が起こらないようにしたいと思います。シリアル化は実際に行われ、このクラスの複数のバージョンが存在します。逆シリアル化は、私の制御下にあるサーバーで行われます。そのため、これは逆シリアル化中に最もよく処理されるようです。
IXmlSerializable
を実装してすべての逆シリアル化を「手動で」行う以外に、どうすればこれを実現できますか?
DateTime
として解析する代わりに、DateTimeOffset
として解析して DateTimeOffset.DateTime
タイムゾーンを無視するプロパティ。このような:
[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; }
}
私がしたことは、次のようにDateTime.SpecifyKindメソッドを使用することでした:
DateTime dateTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified);
これで私の問題が解決しました。
this のような提案を試して、新しい文字列プロパティを作成し、XmlIgnore the existing one:
Timeプロパティに[XmlIgnore]を配置します。
次に、新しいプロパティを追加します。
[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); }
}