编程语言
首页 > 编程语言> > c#-不要序列化或从序列化的DateTime对象中删除TimeZone

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

作者:互联网

我得到的奇怪任务是使用XML序列化序列化LARGE对象.该对象包含多个嵌套的UserDefined类以及多个DateTime字段. DateTime数据的要求是,它必须始终显示在最初创建和设置数据的用户的时区中.因此,我不能使用UTC或Local时间,因为在反序列化时,它们与以前不一样.我也无法以UTC显示值,它们必须以本地时间显示.我需要的是一种奇怪的序列化格式,它表示“绝对本地时间”的概念……这将是“没有TimeZone的本地时间”.

我可以使用Regex从日期字符串中删除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()”,然后在重新加载文档后从序列化的字符串数据中手动还原所有日期.这也不切实际.
查看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");
        }
    }

解决方法:

我认为您需要重新评估您的要求或假设.

你写了:

The Requirement for the DateTime data is that it must ALWAYS be displayed in the TimeZone of the user who initially created and set the data. Thus, I Cannot use UTC OR Local times because when de-serialized, the wont be the same as they were.

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

>您要序列化和反序列化许多不同的时间值.
>在“显示”那些时间时,您希望显示使用原始时区.

这些是不同的要求.

序列化DateTime将存储时间,但是您会丢失TimeZone信息.在我看来,您需要分别对每个XML文档分别序列化时区信息.如果这样做,则时间反序列化将自动进行-您始终可以从最初存储的时间中获得准确的存储时间.

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

至于内存不足错误,这可能是一个不相关的问题.这也可能是由于您使用大型XmlDocument对象造成的.使用Xml序列化时,这应该是不必要的.

标签:xml-serialization,datetime,c
来源: https://codeday.me/bug/20191201/2080619.html