不要从序列化的 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 的相关文章

  • 添加 Nullable int 时保持 null?

    我想添加可为空的int 并保留null当所有值都是null 我想要这个结果 1 2 3 1 null 1 null null null O null 0 问题是 如果我将一个值与 null 相加 结果为 null int i1 1 int
  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • CSharpRepl emacs 集成?

    我碰巧知道莫诺CSharpRepl http www mono project com CsharpRepl 是否有 emacs csharp 模式使用它在一个窗口中运行 REPL 并像 python 模式一样在另一个窗口中编译 运行 C
  • 从模板切换传递的类型

    在 C 中是否可以检查传递给模板函数的类型 例如 template
  • 在开关中使用“goto”?

    我看到了一个建议的编码标准 内容如下Never use goto unless in a switch statement fall through 我不跟 这个 例外 案例到底是什么样的 这证明了goto 此构造在 C 中是非法的 swi
  • 如何制作可启动程序?

    所以 这个问题可能看起来很奇怪 但假设我编译了 int main void int x 3 int y 4 int z x y 是否可以让CPU这样运行 如何 例如 这允许我写入监视器吗 如果我没记错的话 内存中有些地方可以写入要显示的内容
  • 在 omp 并行 for 循环中使用 unique_ptr 会导致 SEG.FAULT

    采取以下代码 include
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • 如何对 NServiceBus.Configure.WithWeb() 进行单元测试?

    我正在构建一个 WCF 服务 该服务接收外部 IP 上的请求并将其转换为通过 NServiceBus 发送的消息 我的单元测试之一调用Global Application Start 它执行应用程序的配置 然后尝试将 Web 服务解析为 验
  • C#6 中的长字符串插值行

    我发现 虽然字符串插值在应用于现有代码库的字符串 Format 调用时非常好 但考虑到通常首选的列限制 字符串对于单行来说很快就会变得太长 特别是当被插值的表达式很复杂时 使用格式字符串 您将获得一个可以拆分为多行的变量列表 var str
  • 在 asp.net MVC 中使用活动目录进行身份验证

    我想使用活动目录对我的 asp net mvc 项目中的用户进行身份验证 在网上冲浪了几个小时后 我没有找到任何对我有用的东西 我已经看到了所有结果 但什么也没有 我尝试按照许多帖子的建议编辑我的 web config 如果有人可以帮助我提
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • C++ 中 void(*)() 和 void(&)() 之间的区别[重复]

    这个问题在这里已经有答案了 在此示例代码中 func1是类型void int double and funky是类型void int double include
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • 如何得知客户端从服务器的下载速度?

    根据客户的下载速度 我想以低质量或高质量显示视频 任何 Javascript 或 C 解决方案都是可以接受的 Thanks 没有任何办法可以确定 您只能测量向客户端发送数据的速度 如果没有来自客户端的任何类型的输入来表明其获取信息的速度 您
  • INotifyPropertyChanged 和 propertyName

    我一直不确定它的含义propertyName实施时INotifyPropertyChanged 所以一般来说你实现INotifyPropertyChanged as public class Data INotifyPropertyChan
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne

随机推荐