2011-06-22 101 views
0

我有一個稱爲ConstructionManager的服務器端服務,它的一個操作是GetAll(),它返回一個結構列表。 Construction是數據合同,並有幾種類型,從Construction繼承(BuildingsApartments等)WCF,已知類型的返回列表

當我送公寓都是不錯的名單,所有屬性是對自己的位置,但是當我收到列表在客戶端,並在運行時查看它在接收的對象中,在非公共成員中,我看到所有屬於特定類型的屬性,從Construction繼承,如Rooms,Floor,但在結果視圖中顯示所有屬性具有值「0」,而不是它們被髮送的值。

關於數據契約在類的頂部,構造是KnownType屬性到繼承類。

這可能有助於知道,我使用Web服務軟件工廠。

對不起,我的英語不好。

First image: Server Side GetAll() method, Floors have value: "2"

Second image: Client Side Non public members of list, value of Floors="2"

Third image: Client Result View of list, value of Floors="0"

+2

發佈一些代碼(實體和服務方法簽名),並且在問題描述中有一點清楚。 –

+1

我編輯了這個問題,試圖讓它更清楚些,請讓我知道是否有任何看起來錯誤的東西。並且發佈一些示例代碼,顯示合同以及對象在被髮送回客戶端之前是如何填充的。有一個測試案例,您只需創建一個具有硬編碼值的Apartment,然後將其發送給客戶端並檢查它可能會有所幫助。 –

+0

所以沒有人知道? – croisharp

回答

2

如果你看到屬性中的對象填充在服務只是之前,通過線路發送到客戶端(即剛好系列化之前),然後看到接收到的對象缺少這些屬性中的值,它剛好在後面被客戶端收到,這意味着它們在服務器中丟失了ialization過程。

有你需要記住的系列化兩兩件事:

  1. 你需要確保你寄過來都標有[DataContract]屬性絲類,所有屬性中是用[DataMember]屬性標記。如果屬性不是.NET類型,那麼定義的類(以及其中的屬性)也需要使用這些屬性進行標記。

  2. 類繼承在序列化中丟失。如果你創建了一個類型爲「Building」的對象,並且你的WCF服務方法返回了一個「構造」類型,那麼發送給客戶端的消息可能不會正確序列化(例如它是否只能序列化基類型中定義的屬性「施工」?)。我建議你測試一下,讓你的服務返回繼承類型而不是基類型,然後看它是否修復了這個問題。

我認爲第二點是您的問題最可能的原因。如果您提供您的代碼,我可以更詳細地爲您提供幫助