web-dev-qa-db-ja.com

DateTime値の逆シリアル化時にタイムゾーン変換を防止する

XmlSerializerを使用してシリアル化/逆シリアル化するクラスがあります。このクラスにはDateTimeフィールドが含まれています。

シリアル化すると、DateTimeフィールドはGMTからのオフセットを含む文字列で表されます。例:2010-05-05T09:13:45-05:00。逆シリアル化されると、これらの時間は、逆シリアル化を実行するマシンのローカル時間に変換されます。

説明する価値がない理由で、私はこのタイムゾーンの変換が起こらないようにしたいと思います。シリアル化は実際に行われ、このクラスの複数のバージョンが存在します。逆シリアル化は、私の制御下にあるサーバーで行われます。そのため、これは逆シリアル化中に最もよく処理されるようです。

IXmlSerializableを実装してすべての逆シリアル化を「手動で」行う以外に、どうすればこれを実現できますか?

28
Odrade

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; }
}
24
Adam Hughes

私がしたことは、次のようにDateTime.SpecifyKindメソッドを使用することでした:

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

これで私の問題が解決しました。

29
Arvi

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); }
}
2
SwDevMan81