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.
grazie! funziona bene – ancdev
nessun problema. Per favore accetta come risposta se funziona. – daryal