WCF DataContracts和Polymorphism

时间:2011-04-12 21:17:13

标签: json vb.net wcf polymorphism

这就是我想要做的。这应该(理论上)非常简单。

假设我有一个带有以下代码的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

然而,响应为JSON对象添加了一个“__type”,并且还向JSON对象添加了“DoNotShow”(不是一件好事)。

这里的问题是我不希望传递每个对象唯一的信息。我只想通过基类获取每个对象共有的信息。我所做的一切都不会改变它,除非我遗漏了某些东西,否则WCF的作者在创建它时似乎对OO编程有很好的视角。

您在SO的任何见解都可能会非常感激。

2 个答案:

答案 0 :(得分:0)

出于好奇,为什么重要?通过你给出的例子,我不确定我是否遵循它为什么重要。

我最喜欢的一个选项是从TestObj1继承TestObj2。然后我将取消知识类型(gettype(testobj2))。

如果要动态添加已知类型,则应自行调用datacontractjsonserializer。

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

编辑:这将导致客户端的两个TestObj1对象。不确定你是否想要这种行为。

答案 1 :(得分:0)

如果您的集合只输入BaseObj,我认为序列化程序不可能生成您正在寻找的JSON。

如果只是简单地生成[{"ID":1},{"ID":2}],则收件人无法区分这些类型。另一端如何确定第一个对象是TestObj1类型但第二个对象是TestObj2类型?