[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 = 0; else failNum = Convert.ToInt32(value); }
实体类:[XmlRoot("stream")]public class _30320DuisiFukuanQueryResponseModel : ResponseModelBase{ /// <summary> /// 成功总笔数 int(4) /// </summary> public int succNum { ...
xml序列号错误((XmlHelper.Deserialize))提示:XML 文档(1, 2)中有错误。{"不应有 <entryOrder xmlns=''>。"}
原因:1.缺少根目录(<root>)2.xml字段转换失败(string->int)
---------------------------------------------------...
使用XmlSerializer可以方便的将对象序列化为xml,实现应用之间的数据交互。但是XmlSerializer却不能很好地序列化类型中的可空字段。例如,有如下定义的类Person:
C#代码
System.InvalidOperationException: XML 文档(40, 11)中有错误。 ---> System.Xml.XmlException: 根级别上的数据无效。 第 40 行,位置 11。
在 System.Xml.XmlTextReaderImpl.Throw(Exception e)
在 S...
可以使用pickle模块来实现Python的数据序列化和反序列化。pickle模块可以将Python对象转换为字节流,也可以将字节流转换为Python对象。以下是一个简单的示例代码:
# 序列化
import pickle
data = {'name': 'Alice', 'age': 25, 'gender': 'female'}
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
# 反序列化
with open('data.pkl', 'rb') as f:
data = pickle.load(f)
print(data)
输出结果为:
{'name': 'Alice', 'age': 25, 'gender': 'female'}
注意:pickle模块只能在Python中使用,不能与其它语言交互。如果需要与其它语言交互,可以考虑使用JSON或XML等通用的数据格式。