У меня есть веб-сервис.NET (использующий asmx... еще не обновили до WCF), который выставляет следующее:
public class WidgetVersion1 : IWidget {}
public class WidgetVersion2 : IWidget {}
Когда я пытаюсь связать с веб-сервисом, я получаю следующую ошибку сериализации:
Не может сериализировать участника WidgetVersion1 типа IWidget, потому что это - интерфейс.
Я попытался добавить различные атрибуты к интерфейсу IWidget (XmlIgnore
, SoapIgnore
, NonSerialized
), но они не допустимы в интерфейсе.
Кто-либо знает, почему я не могу выставить интерфейс? Я предполагаю, что WSDL не поддерживает интерфейсы, но разве.NET не могла обойти это, просто не сериализировав интерфейс? Есть ли какие-либо пути вокруг этого кроме удаления интерфейса IWidget от WidgetVersion1 и определений классов WidgetVersion2?
WCF также не может сериализовать интерфейс; на самом деле сериализовать интерфейс через SOAP невозможно.
Причина (упрощенно) состоит в том, что при десериализации .NET должен иметь возможность создать некий реальный конкретный класс. Интерфейс - это абстрактное понятие; за этим всегда должна быть «реальная» реализация класса, чтобы существовал реальный экземпляр.
Поскольку вы не можете создать физический экземпляр интерфейса, он также не может быть сериализован.
Если вы пытаетесь использовать XmlIgnoreAttribute
, помните, что его применение к типу ничего не даст. Вместо этого его необходимо применить к члену . Другими словами:
public class SerializableClass
{
[XmlElement]
public int ID { get; set; }
[XmlElement]
public string Name { get; set; }
[XmlIgnore]
public IMyInterface Intf { get; set; }
}
... сериализует ОК, потому что сериализатор не будет пытаться сериализовать свойство Intf
. Вы просто не можете добавить атрибут [XmlIgnore]
в определение типа IMyInterface
(оно не будет компилироваться).
Создайте функцию AsIWigit (), которая возвращает частный класс моста, реализующий указанный интерфейс.
Это обеспечит способ преобразования этих классов в соответствующий интерфейс по мере необходимости и будет работать со службами ASMX.