私に与えられた奇妙なタスクは、XML シリアライゼーションを使用して LARGE オブジェクトをシリアライズすることです。このオブジェクトには、複数のネストされた UserDefined クラスが含まれており、複数の DateTime フィールドがあります。DateTime データの要件は、最初にデータを作成および設定したユーザーの TimeZone で常に表示される必要があることです。したがって、逆シリアル化すると元の時刻と同じにならないため、UTC OR ローカル時刻は使用できません。また、値を UTC で表示することもできません。ローカル時間で表示する必要があります。私が必要としているのは、「絶対現地時間」の概念を表す奇妙なシリアル化形式です...それは「TimeZoneのない現地時間」になります。
正規表現を使用して、日付文字列から TZ を取り除くことができます。これは簡単です。しかし、私が扱っているオブジェクトのサイズが非常に大きいため、OutOfMemoryException が頻繁に発生します。一度デバッグなしで実行するのを見たところ、操作中に使用メモリが 100k から 800k に急増しました。よくない。そして、それはより小さなファイルの1つでした。
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")
これまでのところ、私が見た唯一のオプションは、すべての dateTime フィールドの複製を作成し、DT フィールド自体を "XmlIgnore()" として設定し、ドキュメントが再ロードされた後にシリアル化された文字列データからすべての日付を手動で復元することです. これも実用的ではありません。カスタムの DateTime XML シリアル化を参照してください。
TimeZone データなしで DateTime オブジェクトをシリアル化するようにシリアル化エンジンを強制する方法はありますか? オブジェクト内のすべての DT プロパティに個別に適用する必要のない一般的なものが望ましいですか?
!!編集!!
部分的な解決策を見つけたかもしれません。少なくとも前進するのに役立つかもしれません。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");
}
}