2009-10-04 6 views
1

Devrait-il y avoir un problème en passant ce type de collection dans WCF?WCF passant collection de plusieurs types

class Parent 
{ 
    [DataMember] 
    // some data members 

    [DataMember] 
    Child myChild;  
} 

class Child : Parent 
{ 
    [DataMember]  
    // some more data members 

    [DataMember] 
    Parent myParent; 
} 

Devrait-il y avoir un problème en passant une liste de Parent?

Je reçois des résultats étranges, parfois les défauts de la chaîne, parfois il ne se bloque pas mais ne me donne pas de données jusqu'à ce que je supprime tous les enfants de la liste.

+0

mis à jour ma réponse avec le CollectionDataContract - Check it out –

Répondre

1

Tout d'abord, vous avez besoin de mettre le [DataContract] sur toutes les classes que vous voulez avoir sérialisé et désérialisé par WCF - il est pas héritera automatiquement une!

[DataContract] 
class Parent 
{ 
    ..... 
} 

[DataContract] 
class Child : Parent 
{ 
    ..... 
} 

Si vous faites affaire avec des collections de choses, alors vous devrez peut-être vérifier dans le CollectionDataContract:

[CollectionDataContract] 
[KnownType(typeof(Parent))] 
[KnownType(typeof(Child))] 
public class CustomCollection : List<Parent> 
{ 
} 

En outre, WCF et SOA en général sont tout à fait un peu différent de la POO et don pas gérer l'héritage tout aussi bien. Vous devrez probablement mettre des attributs [ServiceKnownTypes] ou [KnownType] sur vos contrats de service dans les endroits où vous souhaitez utiliser et prendre en charge le polymorphisme.

Donc, si vous avez une méthode de service qui accepte un Parent, mais devrait également être en mesure d'accepter une instance Child aussi bien, alors vous avez besoin pour décorer la méthode avec l'attribut [KnownType] de rendre ces informations disponibles à WCF. Voir le MSDN Documentation sur l'attribut KnownType ou consultez cet autre SO question sur le sujet.

Marc

+0

Il semble que vous avez raison .. mais , bien que j'aie ajouté tous les bons attributs, j'ai toujours un comportement étrange. Je pense que cela implique le visage que l'objet est créé par NHibernate, et peut-être que le problème est là quelque part ... – Dani

+0

Dani, maintenant vous mentionnez, que vous utilisez NHibernate Autant que je me souvienne, il utilise des classes avec des setters protégés, ai-je raison? Alors que WCF exige que toutes les propriétés marquées avec l'attribut DataContract aient getter et setter publique –

+1

Salut, WCF est bien avec les propriétés NH, En recherchant toujours, j'ai trouvé le problème était que j'ai utilisé un critère typeof (père) pour obtenir les objets, et NH retourné tous les père et fils (comme prévu ...) et WCF ne pouvait pas le gérer - b/c il attendait seulement les objets de type parent (bien que contenant l'objet enfant à l'intérieur n'était pas un problème - ayant Maintenant, je vérifie si je peux changer la requête pour obtenir seulement des objets "Père" et cela devrait résoudre le problème, j'espère – Dani

0

Je recommande d'ajouter IsReference et KnownType à vos classes, comme indiqué ci-dessous:

[DataContract(IsReference = true)] 
[KnownType(typeof(Child))] 
class Parent 
{ 
    [DataMember] 
    some data members 

    [DataMember] 
    Child myChild; 
} 

[DataContract(IsReference = true)] 
class Child : Parent 
{ 
    [DataMember] 
    some more data members 

    [DataMember] 
    Parent myParent; 
} 
+0

Essayé, et a également tué l'héritage, mais il ne fonctionne toujours pas (maintenant le père a seulement un IList de ses enfants, mais l'objet enfant n'hérite pas le père (ils héritent tous les deux de la classe de base) – Dani

+0

Pour collection d'objets génériques qui fonctionnent à travers WCF lire ici: http://borismod.blogspot.com/2009/06/v2-wcf-collectiondatacontract-and.html –

Questions connexes