我收到的一个奇怪的任务是使用 XML 序列化来序列化一个大对象。该对象包含多个嵌套的 UserDefined 类,以及多个 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()”,然后在重新加载文档后手动恢复序列化字符串数据中的所有日期。这也是不切实际的。
看自定义日期时间 XML 序列化 https://stackoverflow.com/questions/306579/custom-datetime-xml-serialization
有没有什么方法可以强制序列化引擎序列化 DateTime 对象而不包含 TimeZone 数据?最好是一些通用的东西,不必单独应用于对象中的每个 DT 属性?
!!EDIT!!
我可能找到了部分解决方案。它至少可能有助于前进。 DateTimeKind.Unspecified 在序列化时似乎没有附加任何时区数据。这是我正在寻找的解决方案吗?使用 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");
}
}