反序列化可空类型的最佳实践

本文关键字:最佳 类型 反序列化 | 更新日期: 2023-09-27 18:06:32

我想对以下xml进行反序列化:

<Root>
    <Order> 
        <Id>12</Id>
        <Date>2013-03-28T16:12:45</Date>
        <Number></Number>
        <Amount></Amount>
    </Order>
</Root>

我的类是这样的:

    [XmlType("Order")]
    public class ImportOrder
    {
        [XmlElement("Id")]
        public int OrderId { get; set; }
        [XmlElement("Date")]
        public DateTime OrderDate { get; set; }
        [XmlElement("Number")]
        public string OrderNumber { get; set; }   
        [XmlElement("Amount", IsNullable = true)]
        public decimal? OrderAmount { get; set; }
    }

我使用的反序列化器:

        public List<T> DeserializeList<T>(string filePath, string rootName)
        {
            var itemList = new List<T>();
            if (File.Exists(filePath))
            {
                var serializer = new XmlSerializer(typeof(List<T>), new XmlRootAttribute(rootName));
                TextReader reader = new StreamReader(filePath);
                itemList = (List<T>)serializer.Deserialize(reader);
                reader.Close();
            }
            return itemList;
        }

当所有数据都填充在xml中时,它工作得很好。如果Number为空,也可以。但是当Amount为空时,我得到异常:

Input string was not in a correct format.

这是因为你不能简单地反序列化可空类型。我在网上找到了多种解决方案来解决这个问题。但是它们看起来不太好,你必须为此写很多代码。

有什么优雅的解决方案吗?反序列化可空类型的最佳实践是什么?

反序列化可空类型的最佳实践

是否有特定的需要以特定的方式保存XML ?

我问这个问题是因为如果您已经告诉XML反序列化器元素Amount是可空的,这意味着该元素可以存在也可以不存在。因此,如果要生成XML,只需要避免生成此元素,就可以开始了。

你可以看到,如果你有一个像这样的文件:

<Root>
    <Order> 
        <Id>12</Id>
        <Date>2013-03-28T16:12:45</Date>
        <Number></Number>
    </Order>
</Root>

你用你的代码解析它,它会工作的