2015-10-16 32 views
1

这里是我的WCF服务类:WCF系列化忽略XmlRoot名称以类实现IXmlSerializable的

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 
    } 
} 

MyRequest类的序列与以下XmlSerializer的情况下进行测试:

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服务和请求类传递给服务后,在XML中的ReadXml得到的是如下:

<request xmlns="http://tempuri.org/"> 
     <Id>123</Id> 
     <ReqContent>...</ReqContest> 
<request> 

WCF串行更换类的根元素,我该如何解决这个问题?

任何想法是值得欢迎和赞赏的,我已经困扰了好几天这个问题。

PS1:我已经阅读post,不知道如何解决这个问题。 PS2:我不确定这是否是由我在项目中使用的ClearUsernameBinding造成的。如果是的话,我怎样才能在不改变绑定的情况下修复它?

回答

2

我觉得在帖子中描述的一切都是在PS1中提到的。你应该决定你的服务是否是SOAP服务。如果是这样,您可以使用消息协定属性完全控制消息协定,而使用datacontract(您实际上不使用它)。如果您想要XML序列化,则应将[XmlSerializerFormat]添加到服务合约中。请参阅DataContract XML serialization and XML attributes

对于自定义序列化,您还可以使用implement your own serializer and inject it into WCF pipeline using behaviors

+0

感谢您的回复。经过几天的研究,我打电话给另一个[问题](http://stackoverflow.com/questions/33295255/why-i-got-null-parameter-in-wcf-service-call-if-i-change-the-消息标签名称),FYR。 – jones