2012-05-15 52 views
8

我有一個名爲contact的抽象類,另一個名爲client的類從contact繼承。我正在處理一個帶有一個類型爲contact的參數的方法的WCF服務。然而,我所擁有的是我想要通過的客戶端實例。 林面臨着這樣的錯誤:WCF服務對象序列化

Type 'xxx.Client' with data contract name 'Client:http://schemas.datacontract.org/2004/07/xxx' is not expected. Add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

回答

5

WCF不直接在抽象類上工作。您應該在datacontract或服務類上使用KnownType屬性。下面是例子;

[DataContract] 
[KnownType(typeof(Client))] 
public class Contact 
{ 
    ... 
} 

[ServiceContract] 
[ServiceKnownType(typeof(Client))] 
public interface IMyService 
{ 
    contact getcontact(Guid id); 
} 
+0

謝謝!工程就好了 – ancdev

+0

沒問題。如果正在工作,請接受作爲答案。 – daryal

7

你定義讓DataContractSerializer的知道,一個Client是一種類型的Contact

有幾種方法可以做到這一點,但都是圍繞着使用KnownType屬性或ServiceKnownType屬性。

可以將KnownType放置在Client類上,以告訴DataContractSerializer它是已知類型Contact

[DataContract] 
[KnownType(typeof(Client))] 
public class Contact{} 

KnownType也可以放在一類,表明這個串行化類時,你可能還會遇到這樣其他類。

您可能希望這樣做,如果你有一個DataContract類有一個屬性,它是一個Contact實際上可能包含Client

[DataContract] 
[KnownType(typeof(Client))] 
public class Meeting 
{ 
    Contact MeetingContact{get;} 
} 

在這種情況下,你可以逃脫不上指定KnownType客戶端。如果您有一個返回集合的屬性並且您想要指定集合中的類型,那麼您可能還想這樣做。

你可以,而不是指定的實際類型的KnownType的,指定將返回已知的類型,而不是一個靜態方法的名稱:

[DataContract] 
[KnownType("GetKnownTypes")] 
public class Meeting 
{ 
    Contact MeetingContact{get;} 

    private static Type[] GetKnownType() 
    { 
    return new Type[]{typeof(Client)}; 
    } 
} 

您也可以通過configuration file指定已知類型。

ServiceKnownTypes以類似的方式工作,但對服務本身的規定:

[ServiceKnownType(typeof(Client))] 
[ServiceContract()] 
public interface IMyServiceContract 
{ 

    [OperationContract] 
    Contact GetContact(); 
} 

此設置將讓DataContactSerializer知道任何方法可以返回一個類型Client型。以類似於已知類型的方式,您也可以使用靜態方法來提供已知類型的服務。

+2

+1:2分鐘太晚了,但更多有用的細節。 –

+0

詳細信息 – daryal