2011-07-18 108 views

回答

2

嘗試通過IList<T>對於基於WCF的服務並不合適。

WCF根據數據契約進行對話,定義服務或客戶端期望發送和接收的數據的形狀。這些合約必須足夠具體,以便序列化程序知道如何將它們轉換爲XML,JSON和其他表示形式。

當你把一個像IList<T>這樣的接口放入你的服務合約中時,你沒有給序列化程序足夠的有關指定形狀數據的信息。你關心的只是發送IList<T>部分的實現嗎?你是否對實現接口的東西中包含的其他有狀態數據感興趣?序列化程序無法知道。

最簡單的解決方案是在WCF中使用基本的數據傳輸對象。這些都是簡單的類,它們只具有表示要通過媒體傳輸信息的工作。這些類僅包含具體類型,並且很容易被序列化程序理解。當你想發送消息時,你可以創建這些對象的實例並用數據填充它們。

對於您的示例,創建List<T>而不是IList<T>,並在將值傳遞到服務之前將其複製到列表中。一個簡單的方法是使用Enumberable.ToList<T>()擴展方法。

+0

謝謝你英雄的好回答。 –

2

串行器需要知道具體的類型,以便與註釋[ServiceKnownType],所以它知道可以使用什麼類型的IList的

更新合同:對象不幫助儘可能串行仍然沒有按」不知道該怎麼做 - 你需要使用[ServiceKnownType]來告訴它 - 你可以在這裏提供一個方法,如果你不想在編譯時顯式地返回類型列表

1

你需要使用泛型並標記它是什麼類型的列表,以便服務知道該期待什麼。一種方法可以是這樣的:

public IList<Something> GetSomething() 

這麼說,我這樣做時,我往往不是僅僅因爲有讀書遲代碼究竟是什麼回事返回(做一個非WCF時少猜測返回數組客戶端在另一端爲它創建一個IList類還是將它轉換成其他東西?)。一切都知道數組是什麼。

+0

我可以使用此類似:公共IList的 GetObject的()? –

+0

當然,如果你希望人們在另一端得到的是Object。但是由於Object沒有數據,這可能不是你想要的。 :)如果你更具體地說明一種方法將要發回的東西,這個東西效果最好。 – Tridus

0

除了使用列表類型
的概念 - 爲什麼不只是使用數組?

數組似乎是最明顯的選擇,因爲它是與IEnumerable的兼容,客戶端可以使用自己的擴展方法