zoukankan      html  css  js  c++  java
  • XML反序列化遇到数字型节点值为空导致反序列化异常

    实体类:

    [XmlRoot("stream")]
    public class _30320DuisiFukuanQueryResponseModel : ResponseModelBase
    {
        /// <summary>
        /// 成功总笔数 int(4)
        /// </summary>
        public int succNum { get; set; }
        /// <summary>
        ///  成功总金额 decimal(15,2)
        /// </summary>
        public decimal succAmount { get; set; }
        /// <summary>
        ///  失败总笔数 int(4)
        /// </summary>
        public int failNum { get; set; }
        /// <summary>
        ///  失败总金额 decimal(15,2)
        /// </summary>
        public decimal failAmount { get; set; }
        /// <summary>
        ///  摘要 varchar(60)
        /// </summary>
        [XmlElement("abstract")]
        public string Abstract { get; set; }
    
        [XmlArray("list"), XmlArrayItem("row")]
        public List<_3320DuisiFukuanQueryResponseDetail> userDataList { get; set; }
    }
    [XmlRoot("row")]
    public class _3320DuisiFukuanQueryResponseDetail : ResponseModelBase
    {
        /// <summary>
        /// 交易序号 int(5)
        /// </summary>
        public int ID { get; set; }
        /// <summary>
        ///  摘要 varchar(64)
        /// </summary>
        [XmlElement("abstract")]
        public string Abstract { get; set; }
        /// <summary>
        /// 收款人账户信息
        /// </summary>
        public AccountPayModel RecAccount { get; set; }
    }


    用System.Xml.Serialization命名空间下的XmlSerializer做反序列化

    using (StringReader sr = new StringReader(xml))
    {
        XmlSerializer xmldes = new XmlSerializer(typeof(T));
        return (T)xmldes.Deserialize(sr);
    }

    今天在测试时,发现xml反序列化报如下异常

    System.InvalidOperationException: "XML 文档(1, 111)中有错误。" ---->System.FormatException:输入字符串的格式不正确。
       在 System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
       在 System.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader)
       在 CommonLibrary.CommonSerialization.CommonSerialization_XMLService.XmlDeserialize[T](String xml) 位置 d:SourceProjectinfrastructure.PayCenter	runkPaymentPlatformCommonLibraryCommonSerializationCommonSerialization_XMLService.cs:行号 58


    查看日志,发现xml是:

    <?xml version="1.0" encoding="GBK"?><stream><abstract></abstract><failAmount></failAmount><failNum></failNum><payAccountNo></payAccountNo><status>CP01128</status><statusText>制单信息无状态</statusText><succAmount></succAmount><succNum></succNum><list name="userDataList"/></stream>

    以为是list节点为空的原因呢,进一步分析,是由于failAmount、failNum、succAmount、succNum这些节点的值为空,而实体类里这些属性是数字类型,在将空串转换为数值类型时出现了FormatException。

    试图将这些属性定义成可空类型,但不奏效。试图利用XmlElement的一些属性来解决,然并卵。
    这时,一种方案是对xml报文做后续Replace处理,将<failNum></failNum>这些Replace成<failNum>0</failNum>,还有failAmount、succAmount、succNum。另一种方案自然是要把这些属性的数据类型改成string了,这样解析出来的属性的值是空串。

    对于后一种方案,这样改的话,会改变外层业务层对这些属性的使用,用字符串类型来保存数量、金额,代码不免有股怪怪的味道。
    为了不改变外层使用,就要在这个实体类里做文章了。见如下示例:

        [XmlIgnore]
        public int failNum { get; set; }
        [XmlElement("failNum")]
        public string FailNumStr
        {
            get { return failNum.ToString(); }
            set { if (value == "")failNum = 0; else failNum = Convert.ToInt32(value); }
        }

     

     

     

     

    ---内容结束---

  • 相关阅读:
    DTOJ #3702. 月读(tsukuyomi)
    DTOJ #2311. 兔子与樱花 ( sakura )
    DTOJ #2416. 点燃的火焰(flame)
    dtoi4537 「TJOI / HEOI2016」树
    中科燕园gis外包------北京市人口普查地理信息系统
    中科燕园gis外包【动态标绘演示系统】v2.0 Flex版
    中科燕园GIS外包-----基于ArcGIS的应急平台
    arcgis server
    《深入理解ES6》之箭头函数
    【转】浏览器的工作原理:新式网络浏览器幕后揭秘
  • 原文地址:https://www.cnblogs.com/buguge/p/7202660.html
Copyright © 2011-2022 走看看