2015-10-16 33 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