WCF DataContracts и полиморфизм - PullRequest
       1

WCF DataContracts и полиморфизм

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

Вот что я хочу сделать.Это (теоретически) должно быть очень просто.

Скажем, у меня есть служба WCF со следующим кодом (функциональность «голые кости»):

<DataContract()>
Public Class BaseObj
    <DataMember()>
    Public ID As Integer
End Class


<DataContract()>
Public Class TestObj1
    Inherits BaseObj

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

End Class


<DataContract()>
Public Class TestObj2
    Inherits BaseObj

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

    <DataMember()>
    Public DoNotShow As String = "fail"

End Class

Вот код, который я хочу написать:

<WebInvoke(Method:="GET", 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(1))
    myObjs.add(new TestObj2(2))
    return myObjs

End Function

Я хочу, чтобы ответ JSON выглядел в точности так: [{"ID":1},{"ID":2}]

Теперь код, который у меня есть, в настоящее время возвращает пустой ответ (не выдано никакой ошибки, информация не передана).Я могу заставить его вернуть что-то , выполнив это:

<DataContract(), KnownType(GetType(TestObj1)), KnownType(GetType(TestObj2))>
Public Class BaseObj
    <DataMember()>
    Public ID As Integer
End Class

Однако в ответ добавляется «__type» к объекту JSON, а также добавляется «DoNotShow» к объекту JSON (не очень хорошая вещь).

Проблема в том, что я не хочу, чтобы передавал информацию, уникальную для каждого объекта.Мне нужна только информация, общая для каждого объекта через базовый класс .Ничто из того, что я могу сделать, не изменит этого, и, если я что-то упустил, создается впечатление, что авторы WCF, создавая это, имели очень несерьезный взгляд на ОО-программирование.будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2011

Если ваша коллекция набрана только в BaseObj, я не думаю, что для сериализатора возможно создать JSON, который вы ищете.

Если бы он просто произвел [{"ID":1},{"ID":2}], получатель не мог бы различить типы. Как другой конец определил бы, что первый объект имеет тип TestObj1, а второй объект имеет тип TestObj2?

0 голосов
/ 13 апреля 2011

Из любопытства, почему это важно? С примером, который вы привели, я не уверен, что понимаю, почему это важно.

Один из вариантов, который у меня есть, - наследовать TestObj2 от TestObj1. Тогда я бы снял Knowntype (gettype (testobj2)).

Если вы хотите динамически добавлять известные типы, вам следует вызвать datacontractjsonserializer самостоятельно.

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.aspx

Редактировать: это приведет к созданию двух объектов TestObj1 на стороне клиента. Не уверен, если вы хотите такое поведение.

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