【问题标题】:Xml-RPC.Net Response Mapping with Struct ArraysXml-RPC.Net 响应映射与结构数组
【发布时间】:2012-03-30 15:20:30
【问题描述】:

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

TLDR

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

说明

正在使用 xml-rpc 规范的 2 种不同实现,每种实现一种。一种是使用相当容易使用的实现,使用具有良好逻辑结构的 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>

结构

这给了我一个小问题,但我已经能够通过一些讨厌的扩展方法来克服它,但我对此并不满意。它与上面类似,但结果现在是一个值数组的数组,我只能将其可视化为 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>

数组

数组响应是真正棘手的地方。对于这些类型的响应,我无法让任何东西可靠地工作。

我已经尝试向对象数组添加一个额外的维度,就像 struct 响应一样,但是我留下了 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>

任何关于如何简单而正确地映射这些类型的响应的指针将不胜感激。

谢谢, 詹姆斯。

【问题讨论】:

    标签: c# xml-rpc


    【解决方案1】:

    XML-RPC.NET 当前不支持将数组映射到类或结构类型,尽管原则上没有什么可以防止这种情况(即,您可以使用新的数组中的顺序注释类/结构成员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;
    }
    

    【讨论】:

    • 谢谢查尔斯,我担心可能是这种情况,我会尝试让我的扩展方法在这种情况下更可靠地工作。是的,你说得对,数组维度已经出来了,经过漫长的一周后,我的头脑有点混乱。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多