实体类:

[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); }
}

---内容结束---

最新文章

  1. Redis实战阅读笔记——第二章
  2. [Leetcode] Bulls and Cows
  3. [vivado系列]Zynq开发常用文档
  4. 冲刺阶段 day 4
  5. cookie入门与学习
  6. Sprint计划会议1
  7. iOS开发-UIColor转UIIamge方法
  8. Android 自学之自动完成文本框 AutoCompleteTextView
  9. css important
  10. css 背景色渐变
  11. 关于数据结构的10个面试题(c语言实现)
  12. 关于对vector3及其衍生变量的理解
  13. Qt---自定义界面之QStyle
  14. 从“跳一跳”来看微信小程序的未来
  15. web-storage-cache 使用JS数据缓存
  16. Jquery制作小星星(常用于评价)
  17. 51单片机学习笔记(郭天祥版)(1)——单片机基础和点亮LED灯
  18. Ireport第一张web项目报表。
  19. 如何删除自己上传的CSDN资源(亲测有效)
  20. logstash-1-安装配置

热门文章

  1. [No0000DA]WPF ControlTemplate简介
  2. mac休眠掉电快,更改休眠模式
  3. [daily][archlinux][shell][fish] 使用最炫酷的shell工具fish
  4. 加载properties文件的三种方法
  5. Excel--数据透视图
  6. js中值的基本类型与引用类型,以及对象引用,对象的浅拷贝与深拷贝
  7. 萌新接触前端的第三课——JavaScript
  8. c# ThreadPool 判断子线程全部执行完毕的四种方法
  9. k皇后
  10. Github安全开源工具集合