为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; }
}

为XML-RPC反序列化未知类型

解决方案:

我必须在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,但我保留了它,因为我正在处理的对象的封闭性质,并希望控制以确认每个"错误"是由于空对象返回。