【问题标题】:Best practices for deserializing nullable types反序列化可为空类型的最佳实践
【发布时间】:2013-03-19 02:11:57
【问题描述】:

我想反序列化以下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.

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

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

【问题讨论】:

标签: c# .net xml-serialization nullable


【解决方案1】:

是否有特定的需要以您所拥有的特定方式拥有 XML?

我问这个是因为如果您已经告诉 XML 反序列化器元素 Amount 可以为空,这意味着该元素可能存在或不存在。因此,如果您正在生成 XML,您只需要避免生成此元素即可。

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

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

然后你用你的代码解析它就行了。

【讨论】:

  • 不,输入 xml 总是有标签 但有时它是空的。使用 IsNullable 我刚刚尝试解决我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 2013-07-27
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多