2009-08-03 11 views
4

Eine meiner [DataContract] -Klassen enthält ein [DataMember], das eine Liste ist. BaseClass hat ein paar verschiedene Unterklassen.WCF - Unterklasse zu einer [DataMember] -Liste hinzugefügt <BaseClass> verursacht Ausnahme

Wenn diese Liste Instanzen einer Unterklasse enthält, tritt während/nach der Rückkehr des Dienstes zum Anforderungskanal eine Ausnahme auf. Wenn die Liste keine Unterklassen enthält, funktioniert es gut. Hier

ist ein Beispiel für meinen Code (die selbst nicht funktioniert):

public class BaseClass 
{ 
} 
public class BaseClassSub : BaseClass 
{ 
} 

[DataContract] 
public class MyClass 
{ 
    List<BaseClass> m_Classes = new List<BaseClass>(); 

    [DataMember] 
    public List<BaseClass> Classes 
    { 
     get { return m_Classes; } 
     set { m_Classes = value; } 
    } 
} 


[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    MyClass GetMyClass(); 

} 

public class MyService : IMyService 
{ 
    public MyClass GetMyClass() 
    { 
     MyClass o = new MyClass(); 

     //THIS WORKS!!!! 
     //o.Classes = new List<BaseClass>() { new BaseClass() }; 

     //THIS DOES NOT WORK!!!! 
     o.Classes = new List<BaseClass>() { new BaseClassSub() }; 

     return o; 
    } 
} 

ich die folgende Fehlermeldung beim Debuggen:

Die Socket-Verbindung wurde abgebrochen. Dies kann durch einen Fehler beim Verarbeiten Ihrer Nachricht oder das Überschreiten einer Empfangszeitüberschreitung durch den Remote-Host oder durch ein zugrunde liegendes Netzwerkressourcenproblem verursacht werden. Das Zeitlimit für lokale Sockets war '00: 00: 59.6560000 '.

Wer weiß, wie man dieses Problem löst (um Unterklassen zu behandeln)?

+0

Bitte lassen Sie uns nicht über die Ausnahme raten. Veröffentlichen Sie die gesamte Ausnahme. Fang es und poste dann ex.ToString(). –

Antwort

4

Sie müssen dem Data Contract Serializer die Typen mitteilen, auf die er stoßen könnte. Siehe Data Contract Known Types.

+0

Danke! Ich habe deine Antwort gerade verpasst, als ich gepostet habe! –

0

Nach mehr Suche, ging ich weiter und legte ein [KnownType] -Attribut auf BaseClass (siehe unten), und es funktioniert jetzt.

[KnownType(typeof(BaseClassSub))] 
public class BaseClass 
{ 
} 

Ich hoffe, das hilft anderen zumindest!

0

DataContrat Deserialisierung nicht nennen Konstruktor und Anfangswerte für die Mitglieder nicht

zugeordnet sind

Es bedeutet, dass m_Classes nach Deserialisieren null sein wird. Stellen Sie sicher, dass Sie dies in Ihrem Code durch OnDeserialize-Ereignis oder durch Erstellen einer Liste in Getter abdecken.