我正在使用Windows Phone 8.1应用程序,我必须处理以下与全球化相关的问题:
我从服务中获取一些DateTime值,并在我的应用程序中将其序列化以供以后使用。使用默认区域性(例如,en-US,日期时间格式为MM-dd-YYYY)。
如果操作系统更改其语言,应用程序将使用其最佳匹配文化(假设它将使用具有以下格式的文本:dd-MM-YYYY)。
在应用启动时,当要检索设置时,应用程序将崩溃,因为DateTime vlue是使用其他格式序列化的。
我正在阅读有关此主题的文章,主要是我发现并阅读了使用特定文化格式保存(在我的情况下序列化)DateTime。那么之后使用不同的格式对它进行反序列化呢? 我不确定如何处理这个问题。
答案 0 :(得分:1)
文化适合人类。一般来说,您应该使用它们向人类显示信息,以及从人类接收信息(例如,当他们在编辑字段中输入内容时)。序列化是一种完全不同的方案,需要采用完全不同的方法。
请注意,计算机本身并不关心文化数据本身,但 需要您保持一致。
特别是,当您格式化(例如string.Format()
,DateTime.ToString()
等)一个值时,您应该使用允许您提供CultureInfo
实例的重载,并传递{ {1}}(或在某些特殊情况下,特定的,硬编码文化)。在解析以这种方式格式化的信息时(例如CultureInfo.InvariantCulture
等),您应该再次使用允许您提供DateTime.TryParse()
实例的重载,并再次传递CultureInfo
(或者在那些不寻常的情况下,首先用于格式化文本的特定的硬编码文化。)
这可确保您的代码从您的数据创建一致的文本,然后可以在以后可靠地解释该文本,无论用户使用何种文化设置。序列化数据可能会或可能不会对尝试阅读它的人产生任何意义;但这并不重要......数据没有为用户的利益而格式化,它的格式是计算机的的好处。
如果由于某种原因,您需要以与用户当前文化设置匹配的方式格式化文本,并且仍然要求稍后可以通过在具有未知文化设置的环境中运行的代码来解析数据,那么必须包含文化名称作为序列化数据的一部分,以便稍后运行的代码可以使用正确的CultureInfo.InvariantCulture
对象进行解析(并再次明确指定它,而不是使用当前文化设置)。当然要注意,如果你这样做,即使是试图阅读数据的人也可能有问题...对于一个人来说,知道文化的名称并不一定能立即导致能够理解使用该数据格式化的数据。培养