2016-04-06 1 views
0

J'ai un objet simple avec une propriété (j'ai plus de propriétés, des simples et des chaînes);WCF ne sérialisera pas ma classe mais le DataContractSerializer semble heureux quand il n'utilise pas WCF

[DataMember] 
    public virtual IList<MailAddress> DistributionList { get; set; } 

Je lis cet objet en utilisant NHibernate, entraînant la beeing de propriété de type NHibernate.Collection.Generic.PersistentGenericList. Je reçois l'erreur suivante lors de l'examen du journal WCF;

Une erreur s'est produite lors de la tentative de sérialisation du paramètre http://tempuri.org/:StartReportDistributionResult. Le message InnerException était

Type 'Miros.Models.MailAddress' avec le nom de contrat de données 'MailAddress: http://schemas.datacontract.org/2004/07/Miros.Models' est pas prévu. Envisagez d'utiliser DataContractResolver si vous utilisez DataContractSerializer ou ajoutez des 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 au sérialiseur. '. S'il vous plaît voir InnerException pour plus de détails.

Cela devrait indiquer que quelque chose ne va pas avec la sérialisation. J'ai donc ajouté du code qui testent l'objet via le DataContractSerializer, à partir de cette question Has anyone created a DataContract testing tool?. Cela fonctionne bien ...

Maintenant, si je change la propriété;

myObject.DistributionList = myObject.DistributionList.ToList();

WCF est heureux. Qu'est-ce qui se passe ici? Comment puis-je savoir quel est le problème?

+0

avez-vous marqué MailAddress et ses membres avec DataContract/DataMember aussi? –

+0

Oui, je l'ai fait. Et cela fonctionne à travers la sérialisation et la désertification du test. – Julius

+0

Exception intérieure? Il est toujours mieux d'appeler simplement ToString sur l'objet exception et de coller le résultat entier dans votre question. En outre, avez-vous essayé d'appliquer le KnownTypeAttribute à la classe avec la propriété? Cela peut être ennuyeux mais cela pourrait résoudre votre problème. – Will

Répondre

0

Cela peut être dû au fait que DataMember est de type IList. Essayez plutôt de le changer en liste de classes concrètes. J'ai trouvé un peu problématique d'utiliser des membres de données de type interface générique dans les contrats WCF, surtout si le membre de l'interface n'est pas initialisé correctement ou s'il est paresseux, je me souviens avoir des problèmes de sérialisation similaires avec les membres de type IEnumerable.

+0

Essayez d'utiliser la liste à la place de IList..hope qui va fonctionner – NishantMittal

+0

Lire aussi http://stackoverflow.com/questions/1294560/wcf-ilist-serialization-issue – NishantMittal

+0

Oui, cela fonctionne, mais j'ai besoin IList. L'ajout de l'attribut KnownType a fonctionné, c'est ce que j'ai fait. La question est pourquoi il se comporte différemment dans les deux contextes. – Julius