2017-04-13 69 views
0

我正在開發一個WebService客戶端,我有派生類型序列化的一些問題。如何序列化派生類型與WCF

Request類

[MessageContract(WrapperName = "Request", WrapperNamespace = "http://www.test.com", IsWrapped = true)] 
public class ServiceRequest 
{ 
    [MessageHeader(Namespace = "http://www.test.com")] 
    public AuthHeader AuthHeader { get; set; } 

    [MessageBodyMember(Name = "Data", Order = 0)] 
    public ServiceObject Request { get; set; } 

    public ServiceRequest() { } 

    public ServiceRequest(AuthHeader authHeader, ServiceObject request) 
    { 
     AuthHeader = authHeader;   
     Request = request; 
    } 
} 

ServiceObject類和派生類型

[XmlRoot(Namespace = "http://www.test.com")] 
[XmlInclude(typeof(TestRequest))] 
public abstract class ServiceObject 
{ } 

[XmlRoot(ElementName = "Test", Namespace = "http://www.test.com")] 
public class TestRequest 
{ } 

結果XML

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header> 
    <h:AuthHeader xmlns="http://www.test.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:h="http://www.test.com"> 
     <Username>TEST</Username> 
     <Password>test</Password> 
    </h:AuthHeader> 
    </s:Header> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Request xmlns="http://www.test.com"> 
     <Data xsi:type="TestRequest" /> 
    </Request> 
    </s:Body> 
</s:Envelope> 

我必須更改以正確序列化派生類嗎?

<Request xmlns="http://www.test.com"> 
    <Data> 
     <Test/> 
    </Data> 
</Request> 

在此先感謝。

回答

0

的那麼簡單:你應該添加KnownType屬性的基礎類是這樣的:

[DataContract] 
[KnownType(typeof(TestRequest))] 
public abstract class ServiceObject 
{ } 
+0

它失敗。異常迫使我使用'XmlInclude'或'SoapInclude'。使用'XmlInclude' **和**'KnownType'產生相同的XML。 – Merrin