具有不变文化的反序列化十进制

Posted

技术标签:

【中文标题】具有不变文化的反序列化十进制【英文标题】:Deserialization decimal with invariant culture 【发布时间】:2016-07-02 10:15:05 【问题描述】:

是否可以用不变的文化反序列化十进制?

我可以用这个模式做到这一点:

 [XmlIgnore]
    public decimal CurrencyValue  get; set; 

    [XmlAttribute("CurrencyValue")]
    public string CurrencyValueString
    
        set  CurrencyValue = Convert.ToDecimal(value, CultureInfo.InvariantCulture); 
    

但是我的容器包含许多小数,我很尴尬这样做很多次。而且它看起来很奇怪。

【问题讨论】:

【参考方案1】:

如果您使用的是 .Net 4.5,您可以决定将 InvariantCulture 作为当前线程或整个应用程序的默认值,使用 CultureInfo.DefaultThreadCurrentCulture。

有关信息,请参阅here。

【讨论】:

【参考方案2】:

我做了一个测试

XmlSerializer ser = new XmlSerializer(typeof(decimal));
        StringBuilder builder = new StringBuilder();
        CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
        var row = XElement.Parse(@"<decimal>321,64</decimal>");
        using (var xmlReader = row.CreateReader())
        
           var result = (decimal)ser.Deserialize(xmlReader);
        

不幸的是,这会引发异常,但第二个示例返回 32164(顺便说一句。结果很好吗?)

XmlSerializer ser = new XmlSerializer(typeof(string));
        StringBuilder builder = new StringBuilder();
        var row = XElement.Parse(@"<string>321,64</string>");
        using (var xmlReader = row.CreateReader())
        
           var result = (string)ser.Deserialize(xmlReader);
           decimal s = Convert.ToDecimal(result,CultureInfo.InvariantCulture);
        

【讨论】:

以上是关于具有不变文化的反序列化十进制的主要内容,如果未能解决你的问题,请参考以下文章

C#中具有多个对象的JSON文件的反序列​​化

Fastjson反序列化随机性失败

具有反斜杠的 Json 序列化数据

pickle 序列化反序列化

BurpWeb安全学院[不安全的反序列化]

JSON中的反序列化和序列化是啥?