C# 文化与LINQ到XML
对于序列化基本类型,LINQ to XML使用不变区域性,但是如果我有一个类似以下的类:C# 文化与LINQ到XML,c#,.net,internationalization,linq-to-xml,C#,.net,Internationalization,Linq To Xml,对于序列化基本类型,LINQ to XML使用不变区域性,但是如果我有一个类似以下的类: class C { public double Value { get; set; } public override string ToString() { return Value.ToString(CultureInfo.CurrentCulture); } public string ToString(IFormatProvider pro
class C
{
public double Value { get; set; }
public override string ToString()
{
return Value.ToString(CultureInfo.CurrentCulture);
}
public string ToString(IFormatProvider provider)
{
return Value.ToString(provider);
}
}
并将C
的实例作为内容传递给XElement
:
new XElement("name", new C { Value = 5.1 });
调用基本的.ToString()
,而不是.ToString(CultureInfo.InvariantCulture)
。这似乎是内置类型和用户定义类的行为之间的异常
有没有办法让LINQ to XML使用用户定义类的不变区域性?一种解决方案是实现
IXmlSerializable
,如下所示:
class C : IXmlSerializable {
public double Value { get; set; }
public override string ToString() {
return Value.ToString(CultureInfo.CurrentCulture);
}
public string ToString(IFormatProvider provider) {
return Value.ToString(provider);
}
public XmlSchema GetSchema() {
throw new NotImplementedException();
}
public void ReadXml(XmlReader reader) {
throw new NotImplementedException();
}
public void WriteXml(XmlWriter writer) {
writer.WriteElementString("Value", Convert.ToString(Value, CultureInfo.CurrentCulture.NumberFormat));
}
}
通过查看,我们可以看到将调用
(string)内容。@FarhadJabiyev如果我不定义到string的转换,我看不出这是如何工作的?但是有什么问题吗?我看到ToString
在GetStringValue
中被调用,所以如果您在类中重写它,您可以在其中使用任何您想要的区域性。是否要将区域性全局设置为不必重写ToString
?我已经尝试过了,似乎从未调用过WriteXml-对象将完全像以前一样序列化。