возможно ли вернуть массив объектных интерфейсов, а не объект?

У меня есть интерфейс, который описывает специализированный список в моем приложении...

Public Interface IAlphabeticListItem

    Property StartingLetter() As String
    Property DetailsList() As Generic.List(Of DetailsData)

End Interface

Несколько объектов реализуют этот интерфейс, но я хочу вернуть их в веб-службу не как базовый объект, а как интерфейс.

<WebMethod()> _
Public Function GetCategoryList(...) As Generic.List(Of IAlphabeticListItem)

    ...

End Function

К сожалению, это вызывает исключение

Не удается сериализовать интерфейс IAlphabeticListItem.

Сведения об исключении: System.NotSupportedException: невозможно сериализовать интерфейс IAlphabeticListItem.

Есть ли способ сделать интерфейс сериализуемым, или мне придется преобразовать каждый из моих объектов в конкретный класс, реализующий интерфейс, а затем вернуть этот класс?


person digiguru    schedule 04.03.2009    source источник


Ответы (2)


И да и нет. Вы не можете напрямую предоставить универсальный класс для сериализации XML, поскольку он не поддерживается. Однако вы можете предоставить необщий интерфейс в той же коллекции и сериализовать его. В этом блоге подробно рассказывается, как это сделать.

http://srtsolutions.com/blogs/billwagner/archive/2006/11/20/xml-serialization-and-generic-interfaces.aspx

person JaredPar    schedule 07.03.2009

У меня нет времени тестировать это прямо сейчас, но в C# вы можете расширять интерфейсы, поэтому я полагаю, что вы можете сделать это в VB.NET.

Просто сделайте IAlphabeticListItem расширением ISerializable

person rgargente    schedule 04.03.2009
comment
Это означало бы, что реализация GetObjectData (информация ByVal As System.Runtime.Serialization.SerializationInfo, контекст ByVal As System.Runtime.Serialization.StreamingContext) реализует System.Runtime.Serialization.ISerializable.GetObjectData в каждом из моих других классов! - person digiguru; 04.03.2009
comment
Если объекты, реализующие эти классы, уже ISerializable, у вас не должно возникнуть никаких проблем. С другой стороны, если это не так, боюсь, вам все равно придется реализовывать интерфейс, так что хуже от этого не будет. - person rgargente; 04.03.2009