WCF序列化用类实现IXmlSerializable忽略XmlRoot名
本文关键字:忽略 XmlRoot IXmlSerializable 实现 序列化 WCF | 更新日期: 2023-09-27 18:18:01
下面是我的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服务。如果是,您可以使用消息契约属性,而不是数据契约(实际上不使用数据契约)来完全控制消息契约。如果您想要XML序列化,您应该在服务契约中添加[XmlSerializerFormat]。参见数据契约XML序列化和XML属性
对于自定义序列化,您还可以实现自己的序列化器,并使用行为将其注入WCF管道。