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?
avez-vous marqué MailAddress et ses membres avec DataContract/DataMember aussi? –
Oui, je l'ai fait. Et cela fonctionne à travers la sérialisation et la désertification du test. – Julius
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