2012-05-15 18 views
8

Ho una classe astratta denominata contatto e un'altra classe chiamata client che eredita dal contatto. Ho a che fare con un servizio WCF con un metodo che accetta un parametro di tipo contact. tuttavia quello che ho è un'istanza di client che voglio passare. Im fronte a questo errore:serializzazione oggetto servizio 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.

risposta

5

WCF non funziona direttamente sulle classi astratte. È necessario utilizzare gli attributi di KnownType nel datacontract o nella classe di servizio. di seguito sono riportati alcuni esempi;

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

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

grazie! funziona bene – ancdev

+0

nessun problema. Per favore accetta come risposta se funziona. – daryal

7

voi ned per far DataContractSerializer sapere che un Client è un tipo di Contact.

Ci sono diversi modi per farlo, ma ruotano tutti intorno usando l'attributo KnownType o gli attributi ServiceKnownType.

Il KnownType può essere inserito nella classe Client per comunicare a DataContractSerializer che è un tipo noto di Contact.

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

Il KnownType può anche essere posizionato su una classe per indicare che quando serializzazione questa classe si può anche incontrare questa classe.

Si consiglia di fare questo se si dispone di una classe DataContract che ha una proprietà che è un Contact che può in realtà contenere un Client:

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

In questo caso si potrebbe ottenere via senza specificare il KnownType su il cliente. Si consiglia inoltre di farlo se si dispone di una proprietà che restituisce una raccolta e si desidera specificare i tipi che possono essere nella raccolta.

Si può, invece di specificare il tipo effettivo del KnownType, specificare il nome di un metodo statico che restituirà i tipi conosciuti invece:

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

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

è anche possibile specificare il tipo conosciuto attraverso il configuration file.

ServiceKnownTypes funzionano in modo simile, ma sono specificate sul Servizio stesso:

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

    [OperationContract] 
    Contact GetContact(); 
} 

Questo set up farà si che il DataContactSerializer sapere che uno dei metodi possono restituire un tipo di tipo Client. Analogamente ai tipi noti, è possibile utilizzare anche un metodo statico per fornire i tipi noti del servizio.

+2

+1: 2 minuti troppo tardi, ma molti più dettagli utili. –

+0

informazioni dettagliate +1. – daryal