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

时间:2014-03-20 15:53:36

标签: c# xml deserialization xml-rpc

我使用CookComputing XML-RPC连接器从网站检索一些数据。在返回的XML中,存在可能存在或可能不存在的对象(地址)。如果存在,则将对象正确地反序列化到类中。如果它不存在则返回的对象是数组类型,而不是类。反序列化会引发有关错误类型的错误。

有人可以协助显示设置我的代码以捕获这两种情况的最佳方法吗?

XML - 地址存在(提取)

<member>
  <name>address</name>
  <value>
    <struct>
      <member>
        <name>parent_id</name>
        <value>
          <string>15088</string>
        </value>
      </member>
    </struct>
  </value>
</member>

XML - 地址不存在(提取)

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

1 个答案:

答案 0 :(得分:1)

关于解决方案的说明:

我不得不在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但是由于我正在处理的对象的封闭性质并希望控制以确认每个“错误”到期而保留它返回null对象。