2011-04-12 58 views
1

這是我想要做的。這應該(理論上)非常簡單。WCF DataContracts和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 

但是響應增加了一個「__type」的JSON對象,還增加了「DoNotShow」的JSON對象(不是一件好事)。

這裏的問題是我不希望傳遞每個對象的唯一信息。我只想要通過基類的每個對象共同的信息。我所能做的任何事情都不會改變它,除非我錯過了某些東西,看起來好像WCF的作者在創建OO編程時有一個非常粗略的觀點。

任何洞察你在這裏SO可能會不勝感激。

回答

0

出於好奇,爲何重要?通過你給的例子,我不確定我是在跟蹤爲什麼它很重要。

我有一個選擇我的頭頂是從TestObj1繼承TestObj2。然後我將取消知道類型(gettype(testobj2))。

如果你想動態添加已知類型,那麼你應該自己調用datacontractjsonserializer。

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

編輯:這將導致在客戶端兩個TestObj1對象。不知道你是否想要這種行爲。

+0

這很重要,因爲雖然TestObj1和TestObj2在本例中非常相似,但它們在實際應用中卻有很大不同。這個想法是,我有多個構建得非常不同的對象,但有一些共同特徵--OO意味着什麼。我*只需要接收端的通用功能*,但不希望排除在不同服務請求中返回TestObj1對象列表的可能性。它是面向對象的101,並且我爲什麼無法在WCF中做到這一點而言語無倫次。 – riwalk 2011-04-13 01:32:58

0

如果你的集合只是輸入BaseObj,我認爲串行器不可能產生你正在尋找的JSON。

如果是簡單生產[{"ID":1},{"ID":2}],接收方無法區分這兩種類型。另一端如何確定第一個對象是TestObj1類型,而第二個對象是TestObj2類型?

+0

當我返回一個BaseObj對象的集合時,我可能希望接收者在哪個Universe中區分類型TestObj1和TestObj2?我希望他們都被視爲BaseObj(因此我將它們作爲BaseObj返回的原因)。如果我*想要區分它們,那麼我不會傳輸BaseObj,而是返回一組TestObj1對象和一組單獨的TestObj2對象。它是多態101,但對WCF的設計者來說似乎是陌生的。 – riwalk 2011-04-13 14:46:36

+0

@stargazer,這將是一個接收器需要反序列化對象的宇宙,因此它在語義上等同於發送的對象。這是我曾經工作過的唯一的宇宙,它是WCF設計的宇宙。我沒有看到你指定要在那個宇宙中工作的期望的序列化輸出 - 沒有足夠的信息。你曾經說過:「它們在實際應用中是完全不同的」,所以它似乎就是你所處的宇宙。或者我錯過了什麼? – 2011-04-15 02:27:45

+0

在這個宇宙中,你要求服務向客戶端展示它的全部功能。假設客戶端和服務器需要彼此完美映射,並假設在框架中沒有位置是荒謬的。應僅告知客戶需要知道的內容。 – riwalk 2011-04-15 23:17:15