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:\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反序列化遇到数字型节点值为空导致反序列化异常的更多相关文章
- C#操作XML,如何获取指定节点值?
博客园提问,结合网友回答http://q.cnblogs.com/q/36082/ 打开是treelist树形显示xml所有节点,递归来实现 xmlDoc = new XmlDocument(); ...
- JS 判断是否为数字 数字型特殊值
JS 数字型三个特殊值 Infinity ,代表无穷大,大于任何数值 -Infinity ,代表无穷小,小于任何数值 NaN ,Not a number,代表一个非数值 isNaN的使用: isNa ...
- XML操作 之获取指定节点值
根据节点名称快速查找 指定节点值 using (TextReader stringReader = new StringReader(clearPassResponse)) { XmlReaderSe ...
- 批量更新带有命名空间的XML文件的多个节点值
/// <summary> /// 批量修改节点值 /// </summary> /// <param name="filePath">路径&l ...
- [原题复现+审计][0CTF 2016] WEB piapiapia(反序列化、数组绕过)[改变序列化长度,导致反序列化漏洞]
简介 原题复现: 考察知识点:反序列化.数组绕过 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 漏洞学习 数组 ...
- 当freemarker中EL表达式的值为空时出现异常的解决方法
<#list pageView.list as msg> <form name="msgForm" id="msgForm" ...
- .net中使用XPath语言在xml中判断是否存在节点值的方法
book.xml<?xml version="1.0" encoding="utf-8" ?> <bookstore> <boo ...
- Sqlserver更新数据表xml类型字段内容某个节点值的脚本
GO USE [JC2010_MAIN_DB] 1.新建备份表JobObjectVersion_JCSchemVersion_BCK) GO IF EXISTS (SELECT * FROM sys. ...
- 解决mybatis-plus更新数据的时候,有值为空导致更新失败的问题
问题 在用mybatis-plus更新数据的时候,更新失败,错误信息如下: Cause: org.apache.ibatis.type.TypeException: Could not set par ...
随机推荐
- 汇编debug工具详解
关于debug工具里的各个指令的用法 debug调试工具详解: r:可以查看,和改变寄存器中的内容具体用法:·直接输入r的时候,回车显示当前指向内存单元中所有寄存器中的内容,并将所指机器码翻译成汇编指 ...
- ubuntu下hadoop0.20.2报错/dfs/name is in an inconsistent state
Hadoop0.20.2在关机重启后,namenode启动报错: 用bin/hadoop namenode -format重新格式化一下就好了.这个问题已经出现了两次.每次都格式化,显然不是一个专业的 ...
- 更新快排中的partition
这一次是将partition 过程中, 维护三个区域. <x =x >x 三区域. 还有个待定的区域. /* * 将数组划分为三个分区, 小于arr[R], 等于arr[R], 大 ...
- CCPC-Wannafly Winter Camp Day3 Div1 - 石头剪刀布 - [带权并查集]
题目链接:https://zhixincode.com/contest/14/problem/I?problem_id=211 样例输入 1 3 5 2 1 1 2 1 2 1 1 2 3 2 1 ...
- inotifywait实现目录监控--http://man.linuxde.net/inotifywait
sudo apt install inotify-tools while inotifywait -q -r -e create,delete,modify,move,attrib --exclude ...
- pause
https://stackoverflow.com/questions/37063700/mm-pause-usage-in-gcc-on-intel?utm_medium=organic&u ...
- DATAPUMP进程查询
SELECT * FROM DBA_DATAPUMP_SESSIONS; SELECT * FROM DBA_DATAPUMP_JOBS; 例如: SYS@orclasm > SELECT * ...
- LeetCode 559 Maximum Depth of N-ary Tree 解题报告
题目要求 Given a n-ary tree, find its maximum depth. The maximum depth is the number of nodes along the ...
- Http-server 的使用
Http-server 是一款基于node.js的web前端开发服务,可以很好的承担前后端解耦后,前端服务的搭建. 1,首先安装node node下载地址:https://nodejs.org/zh- ...
- python摸爬滚打之day06----小数据池、编码解码
1.小数据池 代码块: 一个模块, 一个函数, 一个类, 甚至每一个command命令都是一个代码块. 一个文件也是一个代码块.而不需要创建一个新的数据. 这样会节省更多的内存区域. 在cmd命令行 ...