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?

È stato utile?

Soluzione

è necessario

[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.

Un uso possable può essere trovato in questo

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))

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top