![](/img/trans.png)
[英]WCF REST is failing to deserialize class that implements IXMLSerializable
[英]WCF serialization ignores XmlRoot name with class implement IXmlSerializable
这是我的WCF服务类:
class MyService : IMyService
{
public String GetService(MyRequest request){...}
}
这是请求类:
[XmlRoot("RequestClass")]
class MyRequest : IXmlSerializable
{
public String Id {get;set;}
public String ReqContent {get;set;}
public void ReadXml(XmlReader reader)
{
using (XmlReader rr = reader.ReadSubtree())
{
Id = ...;
ReqContent = ...;
}
}
public void WriteXml(XmlWriter writer)
{
// write customize format content to the writer
}
}
使用以下XmlSerializer实例测试了MyRequest类的序列化:
StringBuilder xml = new StringBuilder();
XmlSerializer ser = new XmlSerializer(typeof(MyRequest), "");
using (XmlWriter writer = XmlWriter.Create(xml))
{
ser.Serialize(writer, req);
}
并得到如下的xml:
<RequestClass>
<Id>123</Id>
<ReqContent>...</ReqContest>
</RequestClass>
这里一切都很好。 但是,在我应用WCF服务并将请求类传递给服务之后,ReadXml中的xml如下所示:
<request xmlns="http://tempuri.org/">
<Id>123</Id>
<ReqContent>...</ReqContest>
<request>
WCF序列化程序替换了类的根元素,如何解决此问题?
任何想法都值得欢迎和赞赏,我已经在这个问题上困扰了几天。
PS1:我已经阅读了这篇文章 ,并且不知道如何解决此问题。 PS2:我不确定这是否是由我在项目中使用的ClearUsernameBinding引起的。 如果是,如何在不更改绑定的情况下进行修复?
我认为一切都在PS1中提到的帖子中进行了描述。 您应该确定您的服务是否为SOAP服务。 如果是这样,您可以使用消息合同属性而不是datacontract(实际上不使用)来完全控制消息合同。 如果要进行XML序列化,则应将[XmlSerializerFormat]添加到服务合同中。 请参阅DataContract XML序列化和XML属性
对于自定义序列化,您还可以实现自己的序列化器,并使用行为将其注入WCF管道 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.