2016-04-06 9 views
0

Ich habe ein einfaches Objekt mit einem propery (I mehr Eigenschaften, einfache ints und Streicher);WCF wird nicht meine Klasse serialisiert aber die DataContractSerializer scheinen glücklich, wenn nicht WCF

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

Ich las dieses Objekt mit NHibernate, in der Eigenschaft beeing vom Typ NHibernate.Collection.Generic.PersistentGenericList führt.

bekomme ich folgende Fehlermeldung, wenn an dem WCF-Log suchen;

Es gab einen Fehler beim Versuch Parameter http://tempuri.org/:StartReportDistributionResult serialisiert werden. Die Innerexception Nachricht

Typ ‚Miros.Models.MailAddress‘ mit Datenvertrag Name war ‚mailadresse: http://schemas.datacontract.org/2004/07/Miros.Models‘ ist nicht zu erwarten. Erwägen Sie die Verwendung eines DataContractResolver, wenn Sie DataContractSerializer verwenden, oder fügen Sie statisch bekannte Typen zur Liste bekannter Typen hinzu, z. B. indem Sie das KnownTypeAttribute-Attribut verwenden oder sie der Liste bekannter Typen hinzufügen, die an den Serializer übergeben werden. Weitere Informationen finden Sie unter InnerException.

Jetzt sollte dies anzeigen, dass etwas mit der Serialisierung nicht stimmt. Also habe ich aus dieser Frage Has anyone created a DataContract testing tool? Code hinzugefügt, der das Objekt über den DataContractSerializer testet. Dies funktioniert gut ...

Nun, wenn ich die Eigenschaft zu ändern;

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

WCF ist glücklich. Was geht hier vor sich? Wie kann ich herausfinden, was das Problem ist?

+0

Haben Sie MailAddress und seine Mitglieder auch mit DataContract/DataMember markiert? –

+0

Ja, tat ich. Und es funktioniert durch die Testserialisierung und Deseralisierung. – Julius

+0

Innere Ausnahme? Es ist * immer * besser, 'ToString' für das Ausnahmeobjekt einfach aufzurufen und das gesamte Ergebnis in Ihre Frage einzufügen. Haben Sie auch versucht, das KnownTypeAttribute auf die Klasse mit der Eigenschaft anzuwenden? Es kann ärgerlich sein, aber es könnte Ihr Problem lösen. – Will

Antwort

0

Es kann auf die Tatsache zurückzuführen sein, dass die Datamember vom Typ IList ist. Versuchen Sie stattdessen, es in eine konkrete Klassenliste zu ändern.

Ich fand es ein wenig problematisch, generische Schnittstellentyp-Datenelemente in WCF-Verträgen zu verwenden, insbesondere wenn das Schnittstellenelement nicht ordnungsgemäß initialisiert oder lazy geladen ist, erinnere ich mich an ähnliche Serialisierungsprobleme mit WCF-Serialisierung mit IEnumerable Typ Data Member.

+0

Versuchen Liste anstelle von IList..hope verwenden, die – NishantMittal

+0

funktioniert Lesen Sie dies auch http://stackoverflow.com/questions/1294560/wcf-ilist-serialization-issue – NishantMittal

+0

Ja, das funktioniert, aber ich brauche IList. Das Hinzufügen des KnownType-Attributs hat funktioniert, also habe ich das gemacht. Die Frage ist, warum es sich in den beiden Kontexten anders verhält. – Julius

Verwandte Themen