【问题标题】:How to define the culture that the XmlSerializer uses如何定义 XmlSerializer 使用的区域性
【发布时间】:2014-01-15 14:38:13
【问题描述】:

我正在使用以下代码反序列化一个 xml 配置文件:

// Create object by deserializing the given xml document
var serializer = new XmlSerializer(typeof(ConfigurationFile));
var stream = File.Open(path, FileMode.Open, FileAccess.Read);
var configFile = serializer.Deserialize(stream);

在配置中,我定义了一些浮点数,如下所示:

DailyThreshold="41.9"

作为小数分隔符“.”是否依赖于文化我想知道如何定义序列化程序用来解析这些数字的文化?

【问题讨论】:

  • 在中立文化中保存配置是一个非常的想法。 XmlSerializer 这样做。

标签: c# localization xml-serialization


【解决方案1】:

如果您同时使用XmlSerializer 进行序列化和反序列化,则无需担心文化:序列化程序不关心文化,也不会以任何方式更改序列化数据。

数据总是以相同的格式序列化,与任何文化设置(UI文化、线程文化、任何一种文化)无关。

MSDN 文档中的证据

我没有找证据就写这个,只是因为XML是一种不同系统和平台之间交换数据的格式,所以序列化格式和反序列化解析在所有系统中必须是相同的。

但是,如果您深入研究 MSDN 文档,您可以阅读以下内容:

XmlConvert 类中的大多数方法用于在字符串和强类型格式之间转换数据。方法与语言环境无关。这意味着它们在进行转换时不会考虑任何区域设置。

Conversion of XML Data Types.

【讨论】:

  • 我试图在 MSDN 上找到这方面的文档,但没有找到。您的答案是基于文档还是观察?
  • 在 MSDN 中很难找到证据,但我做到了。
  • 如果我想使用文化进行序列化怎么办?有没有办法做到这一点/强制这样做?我在另一端有一个报表查看器应用程序,它只读取直接的 XML 值。
  • 在连载中没有文化这回事。所有值都以类似于 InvarinatCulture 的方式进行序列化,以便它们可以安全地反序列化为原始值。我认为您需要将值转换为所需的字符串表示形式,并使用该表示形式序列化一个对象。如果情况不多,我会使用自定义类来特殊表示数据。
  • The **majority** of the methods... 不是很放心
【解决方案2】:

XmlSerializer 类使用你的操作系统的格式配置,它是在区域部分配置的,为了你的程序使用特定的格式,你可以直接分配给线程,如下所示。例如,如果您居住在拉丁美洲国家,则使用 .insted 是很常见的。它是标准表示。

//Write this code at the begining of the program 
CultureInfo culture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
culture.NumberFormat.NumberDecimalSeparator = "."; //Force use . insted of ,
System.Threading.Thread.CurrentThread.CurrentCulture = culture;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多