Quando è opportuno utilizzare l'attributo KnownType?
-
02-10-2019 - |
Domanda
Dopo aver letto il riferimento MSDN, ho ancora domande su quando utilizzare l'attributo KnownType. Capisco che l'attributo comunica informazioni sul tipo al serializzatore, ma quando è necessario? È appropriato quando la classe viene serializzato ha riferimenti di un tipo di classe di base, e ci sono fino pressofuso classi derivati ??che potrebbe essere destinata a tali riferimenti?
Inoltre, ci sono svantaggi ad uso eccessivo all'attributo? Ad esempio, nell'esempio precedente, se la classe serializzato è stato segnato con KnownType (BaseClass), anche se v'è stato un esplicito riferimento a quel tipo?
Soluzione
[KnownType]
per dire di lui circa sottotipi. Lo svantaggio di non di usarlo è che il seguente non funziona:
[DataContract]
class Foo {}
[DataContract]
class Bar : Foo {}
con un metodo sull'interfaccia WCF che restituisce:
public Foo GetFoo() { return new Bar(); }
Senza l'attributo, il serializzatore (soprattutto per mex / tipi di proxy-generated) sarà Non so Bar
, e fallirà. Con l'attributo:
[DataContract, KnownType(typeof(Bar))]
class Foo {}
di lavoro. Questo vale solo per DataContractSerializer
-. Con NetDataContractSerializer
ottenere i dati di tipo in un modo diverso
Altri suggerimenti
Se stai usando XSD "eredità" nello schema.
Hai avuto all'indietro; il KnownTypeAttribute viene applicata alla classe di base ei nomi di tutte le classi derivate che potrebbero essere passati come un riferimento alla base.
Per esempio:
...
KnownType(typeof(POBoxAddress))
KnownType(typeof(StreetAddress))
KnownType(typeof(SingleLineAddress))
KnownType(typeof(ParsedAddress))
public abstract class AddressBase
{
...
}
L'attributo KnownType è necessario quando si sta serializzazione di tipo non concrete quali interfacce o classi di base. Il serializzatore WCF deve sapere su tutte le possibili implementazioni dell'interfaccia o di classe ereditata. Eventuali implementazioni che non conosce causerà un'eccezione serializzazione.
E 'utile anche per i casi come di seguito:
[DataContract]
[knownType(typeof(Person))]
public class KeyValue
{
[DataMember]
public string key {get; set;}
[DataMember]
public string value {get; set;}
// rest of the code
}
Ora valore supponiamo che contiene un oggetto di altra persona di classe diciamo. poi tutto questo a lavorare si deve aggiungere il KnownType (typeof (Persona))