WCF-сериализация объектов с наследованием - PullRequest
1 голос
/ 12 апреля 2011

Вот что я пытаюсь сделать. У меня есть служба отдыха WCF, и мне нужно сериализовать несколько объектов, которые наследуются от одного и того же класса.

В базовых классах нет ничего, что нужно сериализовать.

Вот минимальная демонстрация, показывающая, что я хочу получить на работе:

<DataContract()>
Public Class BaseObj

    <DataMember()>
    Public ID As Integer

    Public Sub New(ByVal idval As Integer)
        ID = idval
    End Sub

End Class

<DataContract()>
Public Class TestObj1
    Inherits BaseObj

    Public Sub New(ByVal id As Integer)
        MyBase.New(id)
    End Sub

End Class

' Different from TestObj1 in real life
<DataContract()>
Public Class TestObj2
    Inherits BaseObj

    Public Sub New(ByVal id As Integer)
        MyBase.New(id)
    End Sub

End Class

А вот код, который его использует:

<ServiceContract()>
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)>
<ServiceBehavior(InstanceContextMode:=InstanceContextMode.PerCall)>
Public Class Service1

    <WebGet(ResponseFormat:=WebMessageFormat.Json, UriTemplate:="Test?reqReportID={reqReportID}")>
    Public Function GetCollection(ByVal reqReportID As Integer) As List(Of BaseObj)

        Dim myObjs As New List(Of BaseObj)
        myObjs.Add(New TestObj1(20))
        myObjs.Add(New TestObj2(20))
        Return myObjs

    End Function

End Class

Если я объявляю Список списком TestObj1, все работает.

Мне не хватает какой-то важной концепции?

EDIT:

Проблема приобретает новый уровень путаницы, глядя на этот код:

    <WebGet(ResponseFormat:=WebMessageFormat.Json, UriTemplate:="Test?reqReportID={reqReportID}")>
    Public Function GetCollection(ByVal reqReportID As Integer) As BaseObj()

        Dim myObjs As New List(Of BaseObj)
        myObjs.Add(New TestObj1(20))
        myObjs.Add(New TestObj2(20))

        '   This guy works. Yields correct result of [{"ID":20},{"ID":20}] )
        Dim testStr As String = New JavaScriptSerializer().Serialize(myObjs.ToArray())

        '   But this guy still has problems...
        Return myObjs.ToArray()

    End Function

1 Ответ

1 голос
/ 12 апреля 2011

Вам не хватает атрибута [KnownType].

WCF требуется способ узнать все возможные типы, чтобы он мог опубликовать WSDL.

Естьвзгляд здесь .

ОБНОВЛЕНИЕ

Проблема в том, что List<T> является не ковариантным .

Использовать IEnumerable<T>вместо этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...