给我的奇怪任务是使用 XML 序列化序列化 LARGE 对象。此对象包含多个嵌套的 UserDefined 类,以及多个 DateTime 字段。DateTime 数据的要求是它必须始终显示在最初创建和设置数据的用户的时区中。因此,我不能使用 UTC 或本地时间,因为在反序列化时,它们不会与原来相同。我也无法以 UTC 显示值,它们必须以当地时间显示。我需要的是一些奇怪的序列化格式,它代表“绝对本地时间”的概念......那就是“没有时区的本地时间”。
我可以使用正则表达式从日期字符串中删除 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")
到目前为止,我看到的唯一选择是创建所有 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");
}
}