使用不同的格式序列化,然后反序列化日期时间

本文关键字:然后 反序列化 日期 时间 序列化 格式 | 更新日期: 2023-09-27 18:35:59

我正在使用Windows Phone 8.1应用程序,我必须处理以下与全球化相关的问题:

我正在从服务中获取一些 DateTime 值,并在我的应用程序中序列化它以供以后使用。使用默认区域性(例如,en-US,日期时间格式为 MM-dd-YYYY)。

如果操作系统更改其语言,应用将使用其最佳匹配区域性(假设它将使用此格式的区域性:dd-MM-YYYY)。

在应用启动时,如果要检索设置,应用将崩溃,因为 DateTime vlue 是使用不同的格式序列化的。

我正在阅读有关

此主题的文章,并且大多数情况下,我发现并阅读了有关使用特定区域性格式保存(在我的情况下序列化)DateTime的信息。之后使用不同的格式反序列化它怎么样?我不确定如何处理这个问题。

使用不同的格式序列化,然后反序列化日期时间

文化是为人类服务的。通常,您应该使用它们向人类显示信息,以及从人类那里接收信息(例如,当他们在编辑字段中键入某些内容时)。序列化是一个完全不同的方案,需要完全不同的方法。

请注意,计算机并不关心区域性数据本身是什么,但确实需要您保持一致。

特别是,当您格式化(例如 string.Format()DateTime.ToString()等)值,则应使用重载,该重载允许您提供CultureInfo实例,并传递CultureInfo.InvariantCulture(或在某些不寻常的情况下,传递特定的硬编码区域性)。解析以这种方式格式化的信息时(例如 DateTime.TryParse()等),则应再次使用允许您提供CultureInfo实例的重载,并再次传递CultureInfo.InvariantCulture(或者在那些不寻常的情况下,传递您最初用于格式化文本的特定硬编码区域性)。

这可确保代码从数据创建一致的文本,然后无论用户使用何种区域性设置,以后都可以可靠地解释该文本。序列化数据对于试图读取它的人来说可能没有任何意义,也可能没有任何意义;但这并不重要......数据的格式化不是为了用户的利益,而是为了计算机的利益而格式化的。


如果出于某种原因,需要以与用户当前区域性设置匹配的方式设置文本格式,并且仍然要求以后可以通过在具有未知区域性设置的环境中运行的代码分析数据,则必须将区域性的名称作为序列化数据的一部分包含在内。 以便稍后运行的代码可以使用正确的 CultureInfo 对象进行分析(并再次显式指定它,而不是使用当前的区域性设置)。当然,请注意,如果你这样做,即使是试图读取数据的人也可能遇到问题......对于人类来说,知道文化的名称并不一定能立即导致能够理解使用这种文化格式化的数据。