Question

Après avoir lu la référence MSDN, j'ai encore des questions sur le moment d'utiliser l'attribut KnownType. Je comprends que l'attribut communique des informations de type à l'sérialiseur, mais quand est-ce besoin? Est-il approprié lorsque la classe étant sérialisé a des références d'un type de classe de base, et il existe des classes dérivées jusqu'à sous pression qui pourraient être mis à ces références?

Par ailleurs, y at-il des inconvénients à l'utilisation excessive de l'attribut? Par exemple, dans l'exemple précédent, si la classe sérialisée a été marquée par KnownType (BaseClass), même si il y avait une référence explicite à ce type?

Était-ce utile?

La solution

[KnownType] est nécessaire pour lui dire au sujet des sous-types. L'inconvénient de pas à l'aide est que le suivant ne fonctionne pas:

[DataContract]
class Foo {}

[DataContract]
class Bar : Foo {}

avec une méthode sur l'interface WCF que les rendements:

public Foo GetFoo() { return new Bar(); }

Sans l'attribut, le sérialiseur (en particulier pour les types de proxy généré MEX /-) ne connaîtra pas Bar , et il échouera. Avec l'attribut:

[DataContract, KnownType(typeof(Bar))]
class Foo {}

travail. Ceci ne concerne que DataContractSerializer -. Avec NetDataContractSerializer vous obtenez les données de type d'une manière différente

Autres conseils

Si vous utilisez XSD « héritage » dans votre schéma.

Vous l'avez en arrière; la KnownTypeAttribute est appliquée à la classe de base et les noms de toutes les classes dérivées qui pourraient être transmis comme une référence à la base.

Par exemple:

...
KnownType(typeof(POBoxAddress))
KnownType(typeof(StreetAddress))
KnownType(typeof(SingleLineAddress))
KnownType(typeof(ParsedAddress))
public abstract class AddressBase
{
    ...
}

L'attribut KnownType est nécessaire lorsque vous sérialisation types non concrets tels que les interfaces ou classes de base. Le sérialiseur WCF doit connaître toutes les implémentations possibles de l'interface ou la classe héritée. Toute mise en oeuvre qu'il ne connaît pas généreront une exception de sérialisation.

Une utilisation possable se trouve dans cette question SO

Il est également utile pour les cas comme ci-dessous:

[DataContract]
[knownType(typeof(Person))]
public class KeyValue
{
  [DataMember]
  public string key {get; set;}

  [DataMember]
  public string value {get; set;}

  // rest of the code
}

valeur contient un objet suppose d'une autre personne de dire de classe. puis tout cela fonctionne, vous devez ajouter le knownType (typeof (personne))

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top