私が与えられた奇妙なタスクは、XMLシリアル化を使用してLARGEオブジェクトをシリアル化することです。このオブジェクトには、複数のDateTimeフィールドを持つ複数のネストされたUserDefinedクラスが含まれています。 DateTimeデータの要件は、データを最初に作成して設定したユーザーのTimeZoneに常に表示する必要があることです。したがって、デシリアライズされたときは同じではないため、UTCまたはローカル時間を使用することはできません。また、UTCで値を表示することはできません。ローカル時間で表示する必要があります。私が必要とするのは、「絶対ローカル時間」の概念を表す奇妙なシリアル化形式です...「TimeZoneなしのローカル時間」です。シリアル化されたDateTimeオブジェクトからTimeZoneをシリアライズしない、または削除しない
Regexを使って日付文字列からTZを取り除くことは簡単です。私が扱っているオブジェクトの大きさのせいで、OutOfMemoryExceptionが発生することがよくあります。私はデバッグを一度も実行せず、使用中のメモリは動作中に100kから800kにスパイクされているのを見ました。よくない。それは小さなファイルの一つでした。
Doc.DocumentElement.InnerXML = Regex.Replace(Doc.DocumentElement.InnerXML, "(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2})(\\+|-)(\\d{2}:\\d{2})", "$1")
はこれまでのところ、私が見てきた唯一のオプションは、すべての日時フィールドの複製を作成することで、DTは「XmlIgnore()」として自分自身をフィールドに設定した後、手動でシリアライズされた文字列データから、すべての日付を復元docが再ロードされた後これも実用的ではありません。 Custom DateTime XML Serialization
TimeZoneデータなしでシリアル化エンジンでDateTimeオブジェクトをシリアル化する方法はありますか。オブジェクト内のすべてのDTプロパティに個々に適用する必要のない一般的なものが望ましいでしょうか?
!! EDIT !!
私は部分的な解決策を見つけたかもしれません。それは少なくとも前進を助けるかもしれない。 DateTimeKind.Unspecifiedは、シリアル化されても、TimeZoneデータが接続されていないようです。これは私が探している解決策ですか? DateTime.SpecifyKindを使用して、すべてのDateTimeデータを強制的にキャストしますか?
public DateTime? StartDate
{
get
{ return _StartDate; }
set
{
if (_StartDate == value)
return;
if (value != null)
_StartDate = DateTime.SpecifyKind(value.Value, DateTimeKind.Unspecified);
else
_StartDate = value;
OnPropertyChanged("StartDate");
}
}
タイムゾーン(「最初に作成したユーザーのタイムゾーンに表示されます」)を保存し、同時に削除したいですか?あなたが望むものを選んでください...あなたが望む方法でタイムゾーンを処理するための表示コードを修正するのがより簡単なようです。 –
TimeZoneを保持することは目に見える効果です。私が本当にやりたいことは、TimeZoneのデータを完全に無視することです。 TimeZoneがシリアル化されたデータに含まれていない場合は、デシリアライズされたときに格納されたdateTime値に影響しません。 – Nevyn
したがって、ユーザーに「2011年5月5日午前9時」と入力させ、タイムゾーンに関係なく午前9時を過ぎないようにしますか? (朝起きる目覚まし時計に似ています)インドの半時間帯のタイムゾーンに9AMを入力/シリアル化し、米国のタイムゾーン(ほぼ12時間離れていてラウンドアワーの1つ)でデシリアライズされても、それはまだ9AMと表示されますか? –