假设我们正在使用REST WCF服务返回xml。
是否可以“自动”反序列化对DataContract的xml包装响应?
简单示例
类别:
[DataContract]
public class TestClass
{
[DataMember]
string StringValue { get; set; }
[DataMember]
int IntValue { get; set; }
}
服务:
[OperationContract]
[WebGet(UriTemplate = "Test",
BodyStyle = WebMessageBodyStyle.Wrapped,
RequestFormat = WebMessageFormat.Xml,
ResponseFormat = WebMessageFormat.Xml)]
TestClass Test();
客户端:
using (WebClient webClient = new WebClient())
{
webClient.Headers["Content-type"] = "application/xml";
webClient.Encoding = Encoding.UTF8;
return webClient.DownloadString($"{BASE_URL}/Test");
}
反序列化:
// With T as TestClass in or example.
public static T Deserialize<T>(string xml)
{
using (Stream stream = new MemoryStream())
{
byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
stream.Write(data, 0, data.Length);
stream.Position = 0;
DataContractSerializer deserializer =
new DataContractSerializer(typeof(T));
return (T)deserializer.ReadObject(stream);
}
}
此代码适用于裸露的响应。
由于webClient只返回完整的请求,输出xml包含thre包装元素,而DataContractSerializer尝试解析一个简单的字符串,现在不要来自WCF包装的响应(并且应该“忘记”包装器)。
目标是构建一个客户端,其中包装样式(裸/包裹)无关紧要。
答案 0 :(得分:0)
为什么不将输出反序列化为简单的XML?像这样的东西:
public static T XmlDeserializer<T>(string xmlString)
{
var instance = default(T);
var xmlSerializer = new XmlSerializer(typeof(T));
using (var stringreader = new StringReader(xmlString))
instance = (T)xmlSerializer.Deserialize(stringreader);
return instance;
}
注意:由于默认xmlns
标记,您应该在客户端类中使用名称空间,如下所示:
[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/WcfWebService")]