使用Struct Arrays进行Xml-RPC.Net响应映射

时间:2012-03-30 15:20:30

标签: c# xml-rpc

我正在尝试使用第三方提供的几种不同的XML-RPC API服务。我正在使用Cook Computing的xml-rpc.net库:http://xml-rpc.net/

TLDR

我需要帮助将XML-RPC API实现中的 Array 响应类型映射到强类型C#对象。

说明

正在使用xml-rpc规范的两种不同实现,每种实现一个。一个是使用相当容易使用的实现,使用具有良好逻辑结构的StructParams。

另一个......不是那么多。

我设法可靠地获取请求,问题随响应而来。有3种不同的响应类型:

状态消息

这个响应不是很难处理,它包含一个带有嵌套结构和int的结构,可以映射到类似的结构:

public class Response
{
    public Result[] Result;
    public int Status;
}

public struct Result
{
    public string Status;
}

可以如上映射的响应中的XML是:

<?xml version="1.0"?>
<methodResponse>
    <params>
        <param>
            <value>
                <struct>
                    <member>
                        <name>Result</name>
                        <value>
                            <array>
                                <data>
                                    <value>
                                        <struct>
                                            <member>
                                                <name>Status</name>
                                                <value>Everything is OK</value>
                                            </member>
                                        </struct>
                                    </value>
                                </data>
                            </array>
                        </value>
                    </member>
                    <member>
                        <name>TransactionID</name>
                        <value><i4>123</i4></value>
                    </member>
                </struct>
            </value>
        </param>
    </params>
</methodResponse>

结构

这个给我一个小问题,但我已经能够用一些讨厌的扩展方法克服它,我不满意。它与上面类似,但Result现在是一个值数组的数组,我只能将其显示为object [] [] [],所以我将它映射到:

public struct Response
{
    public object[][][] Result;
}

由此,我可以使用我的扩展方法,该方法使用反射将最终数组中的各个对象映射到具有正确类型的特定结构。
我希望有人能想出更好的方法。这是我想要映射的响应XML:

<?xml version="1.0"?>
<methodResponse>
    <params>
        <param>
            <value>
                <struct>
                    <member>
                        <name>Result</name>
                        <value>
                            <array>
                                <data>
                                    <value>
                                        <array>
                                            <data>
                                                <value><i4>1</i4></value>
                                                <value>second slot (string)</value>
                                                <value><double>1.23</double></value>
                                                <value><i4>1</i4></value>
                                                <value>Another string slot</value>
                                            </data>
                                        </array>
                                    </value>
                                </data>
                            </array>
                        </value>
                    </member>
                </struct>
            </value>
        </param>
    </params>
</methodResponse>

阵列

数组响应变得非常棘手。我无法通过这些回复得到任何可靠的工作。

我尝试在结构响应中添加一个额外的维度到对象数组,但是我留下了object[][][][],然后我必须抓住最后的2个维度,循环遍历它们并映射它们到特定结构的数组。我真的希望有一种我在这里缺少的替代方法。

以下是此类响应的示例XML:

<?xml version="1.0"?>
<methodResponse>
  <params>
    <param>
      <value>
        <struct>
          <member>
            <name>Result</name>
            <value>
              <array>
                <data>
                  <value>
                    <array>
                      <data>
                        <value>
                          <array>
                            <data>
                              <value>
                                <i4>1</i4>
                              </value>
                              <value>Disk Space</value>
                              <value>MB</value>
                              <value>
                                <i4>200</i4>
                              </value>
                              <value>
                                <double>0.000000</double>
                              </value>
                              <value>
                                <i4>0</i4>
                              </value>
                            </data>
                          </array>
                        </value>
                        <value>
                          <array>
                            <data>
                              <value>
                                <i4>2</i4>
                              </value>
                              <value>Traffic</value>
                              <value>GB</value>
                              <value>
                                <i4>20</i4>
                              </value>
                              <value>
                                <double>1.000000</double>
                              </value>
                              <value>
                                <i4>0</i4>
                              </value>
                            </data>
                          </array>
                        </value>
                      </data>
                    </array>
                  </value>
                </data>
              </array>
            </value>
          </member>
        </struct>
      </value>
    </param>
  </params>
</methodResponse>

有关如何简单正确地映射这些类型的响应的任何指示都将受到赞赏。

谢谢, 詹姆斯。

1 个答案:

答案 0 :(得分:2)

XML-RPC.NET目前不支持将数组映射到类或结构类型,尽管原则上没有任何东西可以阻止这种情况(即你可以使用new注释类/结构成员在数组中的顺序) XmlRpcMember属性的版本并修改序列化器/反序列化器)。但是现在你必须做一些类似于你建议的事情,虽然我认为你的数组维度错了,类型应该像这样定义:

状态消息

public class StatusResponse
{
  public Result[] Result;
  public int TransactionID;
}

public struct Result
{
  public string Status;
}

结构

public struct StructureResponse
{
  public object[][] Result;
}

阵列

public struct ArrayResponse
{
  public object[][][] Result;
}