当数据不是强类型时,如何通过web服务调用序列化数据是一个非常复杂的问题。我会尽量把它摆出来。
样本存储对象:

[Serializable]
public class StorageObject {
  public string Name { get; set; }
  public string Birthday { get; set; }
  public List<NameValuePairs> OtherInfo { get; set; }
}
[Serializable]
public class NameValuePairs {
  public string Name { get; set; }
  public string Value { get; set; }
}

样品使用:
[WebMethod]
    public List<StorageObject> GetStorageObjects() {
      List<StorageObject> o = new List<StorageObject>() {
        new StorageObject() {
          Name = "Matthew",
          Birthday = "Jan 1st, 2008",
          OtherInfo = new List<NameValuePairs>() {
            new NameValuePairs() { Name = "Hobbies", Value = "Programming" },
            new NameValuePairs() { Name = "Website", Value = "Stackoverflow.com" }
          }
        },
        new StorageObject() {
          Name = "Joe",
          Birthday = "Jan 10th, 2008",
          OtherInfo = new List<NameValuePairs>() {
            new NameValuePairs() { Name = "Hobbies", Value = "Programming" },
            new NameValuePairs() { Name = "Website", Value = "Stackoverflow.com" }
          }
        }
      };

      return o;
    }

Web服务返回值:
<StorageObject>
    <Name>Matthew</Name>
    <Birthday>Jan 1st, 2008</Birthday>
    <OtherInfo>
        <NameValuePairs>
            <Name>Hobbies</Name>
            <Value>Programming</Value>
        </NameValuePairs>
        <NameValuePairs>
            <Name>Website</Name>
            <Value>Stackoverflow.com</Value>
        </NameValuePairs>
    </OtherInfo>
</StorageObject>

我想要什么:
<OtherInfo>
    <Hobbies>Programming</Hobbies>
    <Website>Stackoverflow.com</Website>
</OtherInfo>

原因和其他东西:
首先,我对文章的长度感到抱歉,但我也想给出可重复的代码。
我想要这种格式,因为我正在使用php中的web服务。我想简单地说:
/这很重要
In PHP => "$Result["StorageObject"]["OtherInfo"]["Hobbies"]".

如果是另一种形式,那我根本就没办法做到。此外,在C中,如果我正在使用该服务,我还希望能够执行以下操作:
/这很重要
In C# => var m = ServiceResult[0].OtherInfo["Hobbies"];

不幸的是,我不知道该怎么做。通过构建一个实现IXmlSerializer的自定义字典(请参见StackOverflow: IXmlSerializer Dictionary),我可以用这种方式获得它,但是,它将wsdl模式搞砸了。它也太复杂了,在我的winformstester应用程序中产生了可怕的结果!
有什么办法可以做到这一点吗?我需要创建什么类型的对象?除了创建强类型集合外,还有其他方法可以做到这一点吗?显然,如果我把它设成这样的强类型:
public class OtherInfo {
  public string Hobbies { get; set; }
  public string FavoriteWebsite { get; set; }
}

然后它将完美地工作,我将没有wsdl问题,我将能够很容易地从php和c(.otherinfo.hobbies)访问它。
但是,我会完全失去nvp的意义,因为我必须事先知道列表是什么,并且它是不可更改的。比如说,从数据库里。
谢谢大家!!我希望我们能想出解决办法。以下是要求:
wsdl架构不应中断
名称-值对(nvp)应序列化为属性格式
应该可以很容易地在php中按名称访问nvp[“嗜好”]
应易于在C中访问(并与它的代理生成器兼容)
易于序列化
不需要我强式键入数据
现在,我可以/完全/开放地输入更好/不同的方法来完成这项工作。我正在存储一些相对“静态”的信息(比如名称)和一堆数据。如果有更好的办法,我很想听。

最佳答案

这类似于对象的动态属性。
c不像javascript那样是一种动态语言,或者php可以动态解析对象属性。以下两种方法是我能想到的。第二个可能符合您的要求。
亲吻之道
保持简单愚蠢的方式

public class StorageObject {
  public string Name { get; set; }
  public string Birthday { get; set; }
  public List<string> OtherInfo { get; set; }
}

可以有名称-值对,由“”分隔
OtherInfo = {"Hobbies|Programming", "Website|Stackoverflow.com"}

序列化表单
<StorageObject>
    <Name>Matthew</Name>
    <Birthday>Jan 1st, 2008</Birthday>
    <OtherInfo>
        <string>Hobbies|Programming</string>
        <string>Website|Stackoverflow.com</string>
    </OtherInfo>
</StorageObject>

c语言中的动态方式#
使名称-值对部分成为XML元素,以便可以动态构建它。
public class StorageObject {
  public string Name { get; set; }
  public string Birthday { get; set; }
  public XElement OtherInfo { get; set; } // XmlElement for dot net 2
}

您可以轻松地将otherinfo对象构建为以元素为中心的
例如
XElement OtherInfo = new XElement("OtherInfo");
OtherInfo.Add( ..Hobbies xelement & text value..);
OtherInfo.Add( ..WebSite xelement & text value..);

序列化的表单将是
<OtherInfo>
    <Hobbies>Programming</Hobbies>
    <Website>Stackoverflow.com</Website>
</OtherInfo>

或者以属性为中心
XElement OtherInfo = new XElement("OtherInfo");
OtherInfo.Add( ..nvp xattribute Hobbies & value..);
OtherInfo.Add( ..nvp xattribute WebSite & value..);

<OtherInfo>
    <nvp n="Hobbies" v="Programming" />
    <nvp n="Website" v="Stackoverflow.com" />
</OtherInfo>

对于任何动态语言,它都可以直接访问属性。
对于其他人,他们可以通过读取xml来访问该值。大多数框架都很支持读取xml。

08-26 02:12
查看更多