c# - 由于格式化,XML 反序列化在十进制解析时崩溃

标签 c# .net xml serialization xml-deserialization

当我尝试将 XML 解析为对象时抛出 System.FormatException。据我所知,这是由于 System.Xml.Serialization.XmlSerializer.Deserialize 中使用的区域性导致的,它期望一个点作为十进制字符,但 xml 包含一个逗号。

对象如下所示:


public sealed class Transaction
{
    [XmlElement("transactionDate")]
    public DateTime TransactionDate { get; set; }

    [XmlElement("transactionAmount")]
    public decimal Amount { get; set; }

    [XmlElement("transactionDescription")]
    public string Description { get; set; }

    [XmlElement("transactionType")]
    public int Type { get; set; }

    public static Transaction FromXmlString(string xmlString)
    {
        var reader = new StringReader(xmlString);
        var serializer = new XmlSerializer(typeof(Transaction));
        var instance = (Transaction) serializer.Deserialize(reader);

        return instance;
    }
}

XML:


<transaction>
    <transactionDate> 2013-07-02 <transactionDate>
    <transactionAmount>-459,00</transactionAmount>
    <transactionDescription>description</transactionDescription>
    <transactionType>1</transactionType>
</transaction>

我通过引入第二个属性来使用我自己的文化解析第一个属性来使其工作:


namespace MyNamespace
{
    [XmlRoot("transaction"), XmlType("Transaction")]
    public sealed class Transaction
    {
        [XmlElement("transactionDate")]
        public DateTime TransactionDate { get; set; }

        [XmlElement("transactionAmount")]
        public string Amount { get; set; }

        public decimal AmountAsDecimal {
            get
            {
                decimal value;
                Decimal.TryParse(Amount, NumberStyles.Any, CultureInfo.CreateSpecificCulture("sv-SE"), out value);
                return value;
            }
        }

        [XmlElement("transactionDescription")]
        public string Description { get; set; }

        [XmlElement("transactionType")]
        public int Type { get; set; }

        public static Transaction FromXmlString(string xmlString)
        {
            var reader = new StringReader(xmlString);
            var serializer = new XmlSerializer(typeof(Transaction));
            var instance = (Transaction) serializer.Deserialize(reader);

            return instance;
        }
    }
}


它公开了一个我不想要的额外属性。

所以我的问题是:是否有另一种方法可以做到这一点,而无需遍历每个元素并将其“手动”解析/分配给对象?

最佳答案

XML 序列化器使用标准化的 Number 和 DateTime 格式,该标准在 W3C 模式数据类型规范中定义 http://www.w3.org/TR/xmlschema-2/ .

不要期望 XmlSerializer 会关注线程的 CultureInfo,它有意使用标准化格式以确保您可以独立于区域性/语言环境进行序列化/反序列化。

关于c# - 由于格式化,XML 反序列化在十进制解析时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17437946/

相关文章:

c# - 如何使用 JavaScript 获取客户端系统的屏幕分辨率

c# - Web 部件中的 NullReferenceException

php - XMLA解析获取多个属性

C# 从递归 ObservableCollection 接收特定对象

c# - 复杂对象图的快速哈希码

c# - 如何在运行时确定 C# 中 WPF 控件的边界?

c# - 删除时间部分并以不同格式转换日期时间

.net - iis 中的取消标记未触发

javascript - jQuery 重新加载 xml 文档需要关闭浏览器吗?

python - 如何使用 Python 将此 XML 字符串转换为二进制形式?