2009-02-19 8 views
1

J'écris un service WCF pour remplacer un service Web actuel, et j'ai des problèmes avec l'un des types complexes hérités que je dois retourner.en utilisant WCF avec des types complexes hérités

Malheureusement, je ne peux pas toucher le code mais en les regardant, toutes les classes sont sérialisables et le service web actuel l'utilise sans problème.

Chaque fois que mon client appelle le service WCF il obtient une exception de communication et quand je me suis tourné sur le traçage de WCF est ici l'erreur de sérialisation J'ai trouvé:

Type « Common.Permission.ApplicationGroup » avec le nom de contrat de données 'ApplicationGroup: http://schemas.datacontract.org/2004/07/Common.Permission 'n'est pas prévu. Ajoutez tous les types non connus de manière statique à la liste des types connus - par exemple, en utilisant l'attribut KnownTypeAttribute ou en les ajoutant à la liste des types connus transmis à DataContractSerializer.

Le type que je veux renvoyer est ApplicationPrincipal, mais il semble tomber sur un type enfant. Voici comment ces classes ressemblent:

Le type que je veux revenir:

[Serializable] 
[TypeConverter(typeof(ExpandableObjectConverter))] 
public class ApplicationPrincipal : 
    IPrincipal, ISupportInitialize, IDeserializationCallback, IFormattable 
{ 
    private ApplicationIdentity m_identity; 
    private ApplicationGroupCollection m_groups; 
    private ConditionDictionary m_roleConditions; 

et VOICI ApplicationGroupCollection:

[Serializable] 
public class ApplicationGroupCollection : 
    IList, IEnumerable, IFormattable, ISupportInitialize, 
    IDeserializationCallback, ICloneable, ICustomTypeDescriptor 
{ 
    /// <summary> 
    /// Occurs when a value is being changed in the collection. 
    /// </summary> 
    [field:NonSerialized] 
    public event CollectionChangeEventHandler CollectionChanging; 

    /// <summary> 
    /// Occurs when a value has been changed in the collection. 
    /// </summary> 
    [field:NonSerialized] 
    public event CollectionChangeEventHandler CollectionChanged; 

et enfin, ApplicationGroup:

[Serializable] 
[TypeConverter(typeof(ExpandableObjectConverter))] 
public class ApplicationGroup : 
    ICloneable, ISupportInitialize, IDeserializationCallback, IFormattable 
{ 
    private int m_groupID; 
    private string m_groupName; 
    private string m_groupDesc; 
    private ConditionDictionary m_roleConditions; 

Toutes les suggestions pourquoi WCF n'est pas capable de sérialiser ApplicationGroup?

Répondre

3

Essayez d'ajouter ceux-ci vers le haut de votre DataContract:

[KnownType(typeof(ApplicationGroupCollection))] 
[KnownType(typeof(ApplicationGroup))] 

[Modifier] Sans test, je ne peux pas vous dire si cela va faire l'affaire - Je me demande si le DataContractSerializer sera en mesure de sérialisation votre héritage types comme le DataContractSerializer exige que les types «opt-in» avec des attributs sur le type et tous les membres qui ont besoin de sérialisation. [Edit] Voici la raison du deuxième ensemble d'erreurs que vous voyez. Si vous renvoyez un type personnalisé à partir d'un service, le client doit disposer d'une copie de ce type pour pouvoir désérialiser le message. Cela signifie que vous devrez fournir une copie des assemblys contenant les types hérités au client pour que le client puisse les référencer.

1

Je pense qu'Andrew a raison.

Voir également le chapitre 3 de "Programming WCF Services" de Juval Lowy. Il contient des informations détaillées sur DataContracts et je suis à peu près sûr qu'il couvre exactement ce que vous demandez ici.

+0

merci pour le pointeur, je viens de mettre la main sur une copie du livre de Juval Lowy (2ème édition même!) Sur sarfaribooksonline, jetterai un coup d'oeil au chapitre 3 et se familiariser avec les exigences de datacontract dans WCF – theburningmonk

+0

loin de la meilleure référence WCF que j'ai vu. –

Questions connexes