2009-08-03 6 views
4

Один из моих классов [DataContract] содержит [DataMember], который является List. BaseClass имеет несколько разных подклассов.WCF - Подкласс, добавленный в список [DataMember] <BaseClass> вызывает исключение

Всякий раз, когда этот список содержит экземпляры любого подкласса, возникает исключение во время/после того, как служба возвращается к каналу запроса. Если список не содержит подклассов, он отлично работает.

Вот пример моего кода (который сам по себе не работает):

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; 
    } 
} 

Я получаю следующее сообщение об ошибке при отладке:

Подключение гнездо было прервано. Это может быть вызвано ошибкой обработки вашего сообщения или превышением времени приема удаленным хостом или проблемой сетевого ресурса. Локальный тайм-аут гнезда был «00: 00: 59.6560000».

Кто-нибудь знает, как решить эту проблему (получить ее для обработки подклассов)?

+0

Пожалуйста, не заставляйте нас гадать об исключении. Опубликуйте все исключение. Поймайте его, а затем опубликуйте ex.ToString(). –

ответ

4

Вам необходимо указать Serializer Data Contract Serializer типы, с которыми он может столкнуться. См. Data Contract Known Types.

+0

Спасибо! Я просто пропустил ваш ответ, когда я отправлял сообщения! – 2009-08-03 04:09:32

0

После большего поиска я пошел дальше и положил атрибут [KnownType] на BaseClass (см. Ниже), и теперь он работает.

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

Я надеюсь, что это поможет другим, по крайней мере!

0

DataContrat десериализация не вызывает конструктор и начальные значения для членов не назначены

Это означает, что m_Classes будет нулевым после десериализации. Убедитесь, что вы включили это в свой код, либо с помощью события OnDeserialize, либо путем создания списка в getter.