簡體   English   中英

WCF序列化使用類實現IXmlSerializable忽略XmlRoot名稱

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM