实体类:

[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:\SourceProject\infrastructure.PayCenter\trunk\PaymentPlatform\CommonLibrary\CommonSerialization\CommonSerialization_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 = ; else failNum = Convert.ToInt32(value); }
}

---内容结束---

XML反序列化遇到数字型节点值为空导致反序列化异常的更多相关文章

  1. C#操作XML,如何获取指定节点值?

    博客园提问,结合网友回答http://q.cnblogs.com/q/36082/   打开是treelist树形显示xml所有节点,递归来实现 xmlDoc = new XmlDocument(); ...

  2. JS 判断是否为数字 数字型特殊值

    JS 数字型三个特殊值 Infinity ,代表无穷大,大于任何数值 -Infinity ,代表无穷小,小于任何数值 NaN ,Not a number,代表一个非数值  isNaN的使用: isNa ...

  3. XML操作 之获取指定节点值

    根据节点名称快速查找 指定节点值 using (TextReader stringReader = new StringReader(clearPassResponse)) { XmlReaderSe ...

  4. 批量更新带有命名空间的XML文件的多个节点值

    /// <summary> /// 批量修改节点值 /// </summary> /// <param name="filePath">路径&l ...

  5. [原题复现+审计][0CTF 2016] WEB piapiapia(反序列化、数组绕过)[改变序列化长度,导致反序列化漏洞]

    简介  原题复现:  考察知识点:反序列化.数组绕过  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 漏洞学习 数组 ...

  6. 当freemarker中EL表达式的值为空时出现异常的解决方法

     <#list pageView.list as msg>      <form name="msgForm" id="msgForm" ...

  7. .net中使用XPath语言在xml中判断是否存在节点值的方法

    book.xml<?xml version="1.0" encoding="utf-8" ?> <bookstore>  <boo ...

  8. Sqlserver更新数据表xml类型字段内容某个节点值的脚本

    GO USE [JC2010_MAIN_DB] 1.新建备份表JobObjectVersion_JCSchemVersion_BCK) GO IF EXISTS (SELECT * FROM sys. ...

  9. 解决mybatis-plus更新数据的时候,有值为空导致更新失败的问题

    问题 在用mybatis-plus更新数据的时候,更新失败,错误信息如下: Cause: org.apache.ibatis.type.TypeException: Could not set par ...

随机推荐

  1. HDU 5985/nowcoder 207D - Lucky Coins - [概率题]

    题目链接:https://www.nowcoder.com/acm/contest/207/D 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5985 ...

  2. [knowledge][perl][pcre][sed] sed / PCRE 语法/正则表达式

    一直用sed一直没有正经的学过语法,一直一知半解的用着. 因为,它用来perl的语法,要想搞懂,首先要搞懂perl,系统的入个门... 之前,man sed,man了好多次,总是没找到关键内容,今天在 ...

  3. python学习目录(转载)

    python基础篇 python 基础知识    python 初始python    python 字符编码    python 类型及变量    python 字符串详解 python 列表详解 ...

  4. 《linux 文件目录》- touch/rm/mv/cat/head/tail/cp/mkdir/chmod/chown/find/locate/which/whereis

    一:基本 / 根目录下目录结构定义 /bin 常见的用户指令 ls/echo ...... 等 /boot 内核和启动文件 /dev 设备文件 /etc 系统和服务配置文件 /home 用户家目录 / ...

  5. 洛谷P3248 树 [HNOI2016] 主席树+倍增+分治

    正解:主席树+倍增+分治 解题报告: 传送门! 首先看到这题会想到之前考过的这题 但是那题其实简单一些,,,因为那题只要用个分治+预处理就好,只是有点儿思维难度而已 这题就不一样,因为它说了是按照原树 ...

  6. ubuntu14.04下开启ssh服务

    1. 安装 sudo apt-get update sudo apt-get install openssh-server 2.开启服务 查看查看ssh服务是否启动 打开"终端窗口" ...

  7. 所使用的“System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35”版本高于所引用的程序集“System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”的版本

    System.Web.Mvc.dll引用是感叹号. 解决方法:新建mv3应用程序,右键选择System.Web.Mvc.dll 查看所引用的路径. 在旧程序中重新引用即可.C:\Program Fil ...

  8. python安装提示错误Could not find a version that satisfies the requirement dateutil

    今天ytkah在安装python3组件时提示如下错误,这个是缺少依赖的问题,就试着用pip3 install dateutil,但还是提示同样的错误,怎么处理呢? Could not find a v ...

  9. UIDatePicker封装

    #import <UIKit/UIKit.h> #import <objc/runtime.h> @protocol datePickerViewDelegate <NS ...

  10. 0703-spring cloud config-git配置属性加解密之对称加密

    一.概述 可以使用{cipher} *格式的加密值,只要有一个有效的密钥,那么它们将在主应用程序上下文获取环境之前被解密.要在应用程序中使用加密功能,您需要在您的类路径中包含Spring Securi ...