首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Struct数组的Xml-RPC.Net响应映射

基于Struct数组的Xml-RPC.Net响应映射
EN

Stack Overflow用户
提问于 2012-03-30 15:20:30
回答 1查看 5.6K关注 0票数 2

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

TLDR

我需要帮助将阵列响应类型从XML实现映射到强类型的C#对象。

解释

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

另一个..。没那么多。

我已经成功地将请求可靠地传递出去了,问题在于响应。有三种不同的响应类型:

状态消息

使用此响应并不太困难,它包含一个带有嵌套结构和int的结构,可以映射到以下内容:

代码语言:javascript
复制
public class Response
{
    public Result[] Result;
    public int Status;
}

public struct Result
{
    public string Status;
}

响应中可以映射的XML如下所示:

代码语言:javascript
复制
<?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[],所以我将它映射到:

代码语言:javascript
复制
public struct Response
{
    public object[][][] Result;
}

然后,我可以使用扩展方法,它使用反射将最终数组中的各个对象映射到具有正确类型的特定结构。

我希望有人能想出一种更好的方法。下面是我试图映射的响应XML:

代码语言:javascript
复制
<?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[][][][],然后我必须获取最后的二维,循环遍历它们并将它们映射到一个特定结构的数组中。我真的希望有一个替代的方法,我在这里错过了。

下面是这种响应的XML示例:

代码语言:javascript
复制
<?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>

任何关于如何简单、正确地映射这类响应的提示都将不胜感激。

谢谢詹姆斯。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-31 23:20:33

XML-RPC.NET目前不支持将数组映射到类或结构类型,尽管在原则上没有什么可以阻止这一点(例如,您可以使用XmlRpcMember属性的新版本注释类/ struct成员在数组中的顺序,并修改序列化程序/反序列化器)。但是现在您必须做一些与您建议的类似的事情,尽管我认为您弄错了数组的维度,并且应该像这样定义类型:

状态消息

代码语言:javascript
复制
public class StatusResponse
{
  public Result[] Result;
  public int TransactionID;
}

public struct Result
{
  public string Status;
}

结构

代码语言:javascript
复制
public struct StructureResponse
{
  public object[][] Result;
}

数组

代码语言:javascript
复制
public struct ArrayResponse
{
  public object[][][] Result;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9945863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档