如果返回类型可能是Error或Success对象,如何反序列化XML
我正在使用基于XML的API,因为它的根节点可以返回SuccessResponse
或ErrorResponse
。
我使用下面的方法来反序列化数据,但我不知道如何处理返回不是SuccessResponse
。 处理返回的XML不是预期格式的情况的最佳方法是什么?
我知道我可以做一个黑客的方式,并寻找SuccessResponse
或ErrorResponse
但感觉不对。
TheIconicApiResult result = this.apiService.SendGetRequest("GetProducts", new List() { new FilterParam("live"), new LimitParam(5000) }); IXmlSerialiser xmlSerialiser = new XmlSerialiser(); var xmlBody = xmlSerialiser.ParseXML(result.ResponseBody); public TObject ParseXML(string xml) { using (TextReader reader = new StreamReader(GetMemoryStream(xml))) { XmlSerializer serialiser = new XmlSerializer(typeof(TObject)); return (TObject)serialiser.Deserialize(reader); } }
如果您的XML流包含多种可能的文档类型之一,则可以为每种类型构造XmlSerializer
,并调用XmlSerializer.CanDeserialize(XmlReader)
以连续测试是否可以将文档反序列化为该类型。 此方法不会使XmlReader
超过根元素,因此可以多次调用它而无需重新读取流。
例如,您可以引入以下扩展方法:
public static partial class XmlSerializerExtensions { public static object DeserializePolymorphicXml(this string xml, params Type[] types) { using (var textReader = new StringReader(xml)) { return textReader.DeserializePolymorphicXml(types); } } public static object DeserializePolymorphicXml(this TextReader textReader, params Type[] types) { if (textReader == null || types == null) throw new ArgumentNullException(); var settings = new XmlReaderSettings { CloseInput = false }; // Let caller close the input. using (var xmlReader = XmlReader.Create(textReader, settings)) { foreach (var type in types) { var serializer = new XmlSerializer(type); if (serializer.CanDeserialize(xmlReader)) return serializer.Deserialize(xmlReader); } } throw new XmlException("Invalid root type."); } }
然后使用如下:
var xmlBody = result.ResponseBody.DeserializePolymorphicXml(typeof(SuccessResponse), typeof(FailResponse)); if (xmlBody is SuccessResponse) { // Handle successful response } else if (xmlBody is FailResponse) { // Handle failed response } else { // unknown response throw new InvalidOperationException("unknown response"); }
样品小提琴 。
上述就是C#学习教程:如果返回类型可能是Error或Success对象,如何反序列化XML分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1006309.html