这是一个非常复杂的问题,当数据不是强类型时,如何通过 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 的自定义 Dictionary (请参阅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) 应序列化为属性格式
- 通过名称 ["Hobbies"] 应该很容易在 PHP 中访问 NVP
- 应该很容易在 C# 中访问(并且与它的代理生成器兼容)
- 易于序列化
- 不需要我强输入数据
现在,我/完全/愿意输入更好/不同的方式来做到这一点。我正在存储一些相对“静态”的信息(如名称)和一堆数据。如果有更好的方法,我很想听听。