不要从序列化的 DateTime 对象中序列化或删除 TimeZone

2024-04-20

我收到的一个奇怪的任务是使用 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");
        }
    }

我认为你需要重新评估你的要求或假设。

你写了:

日期时间数据的要求是它必须始终显示在最初创建和设置数据的用户的时区中。因此,我无法使用 UTC 或当地时间,因为反序列化时,它们不会与原来相同。

我不认为你的分析是正确的。在我看来,您不必要地将序列化存储与“显示”给用户混合在一起。但这两件事不应该有关联。据我了解,他们的要求是:

  • 您想要序列化和反序列化多个不同的时间值。
  • 当“显示”这些时间时,您希望显示使用原始时区。

这些是不同的要求。

序列化 DateTime 将存储一个时间点,但您会丢失时区信息。在我看来,您需要为每个 XML 文档单独序列化时区信息一次。如果你这样做,那么时间的反序列化会自动进行 - 你总是会得到准确的时刻out您最初放置的存储空间into贮存。

当你display时间,使用单独存储在XML文档中的时区信息。如果原始对象中不存在包含 TimeZone 的属性,那么在我看来,您的对象模型不太适合应用程序的要求,在这种情况下,您需要修改对象定义以包含标识该对象的字符串时区。 (看http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx)

至于内存不足错误,那可能是一个不相关的问题。这也可能是由于您对大型 XmlDocument 对象进行了操作。当使用 Xml 序列化时,这应该是不必要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不要从序列化的 DateTime 对象中序列化或删除 TimeZone 的相关文章

随机推荐