【发布时间】:2012-04-25 23:14:28
【问题描述】:
我得到的奇怪任务是使用 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()”,然后在 doc 之后手动从序列化字符串数据中恢复所有日期重新加载。这也不实用。 见Custom DateTime XML Serialization
有没有办法强制序列化引擎在没有 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");
}
}
【问题讨论】:
-
您想保留时区(“显示在最初创建的用户的时区中”)并同时删除它?选择一个你想要的......似乎修复显示代码以你想要的方式处理时区会更容易。
-
保留时区是可见的效果。我真正想做的是完全忽略 TimeZone 数据。如果 TimeZone 从未包含在序列化数据中,则在反序列化时不会影响存储的 dateTime 值。
-
所以您想让用户输入“2011 年 5 月 5 日上午 9:00”并且无论时区如何都应该保持在上午 9 点? (类似于早上叫醒你的闹钟)即在印度的半小时时区输入/序列化上午 9 点,当在美国的一个时区(相隔近 12 小时和整小时)反序列化时,仍显示为上午 9 点?
-
这或多或少与您的问题中所述相反...建议作为答案发布。
-
太奇怪了!!提出问题的人回答了他自己的问题,没有投票。答案标记为正确,投反对票。发生了什么。 +1 为您的答案而不是问题。在过去的几个小时里,这件小事一直困扰着我。
标签: c# datetime xml-serialization