为XML-RPC反序列化未知类型
本文关键字:类型 未知 反序列化 XML-RPC | 更新日期: 2023-09-27 17:51:14
我使用CookComputing XML-RPC连接器从网站检索一些数据。在返回的XML中有一个对象(地址),它可能存在,也可能不存在。如果存在,则将对象正确地反序列化到类中。如果它不存在,则返回的对象是数组类型,而不是类类型。反序列化抛出关于类型错误的错误。
谁能帮助展示最好的方式来设置我的代码捕获这两种情况?
XML - Address Exists (Extract)
<member>
<name>address</name>
<value>
<struct>
<member>
<name>parent_id</name>
<value>
<string>15088</string>
</value>
</member>
</struct>
</value>
</member>
XML - Address不存在(Extract)
<member>
<name>address</name>
<value>
<array>
<data/>
</array>
</value>
</member>
c#构造函数private OrderAddress _shipping_address;
public OrderAddress shipping_address
{
get { return _shipping_address; }
set { _shipping_address = value; }
}
解决方案:
我必须在Visual Studio中加载CookComputing XML-RPC项目,并更改错误的方法以返回正确对象的空实例。
XmlRpcDeserializer.cs
private object MapArray(IEnumerator<Node> iter, Type valType,
MappingStack mappingStack, MappingAction mappingAction,
out Type mappedType)
{
mappedType = null;
// required type must be an array
if (valType != null
&& !(valType.IsArray == true
|| valType == typeof(Array)
|| valType == typeof(object)))
{
if(valType.ToString().Contains("OrderAddress")){ //change this to your mismatch
iter.MoveNext(); //moves increment on through the xml
return Activator.CreateInstance(valType); //returns empty instance of correct object
}
throw new XmlRpcTypeMismatchException(mappingStack.MappingType
+ " contains array value where "
+ XmlRpcTypeInfo.GetXmlRpcTypeString(valType)
+ " expected " + StackDump(mappingStack));
}
理论上,您应该能够替换抛出并删除if
,但我保留了它,因为我正在处理的对象的封闭性质,并希望控制以确认每个"错误"是由于空对象返回。