1. 程式人生 > >關於WebService傳遞自定義物件的問題

關於WebService傳遞自定義物件的問題

 最近做一個專案,用Castle封裝資料層,用WebService封裝業務層(主要是由於系統採用CS,BS混和型,這樣做可以不用重複寫業務,而且Cs部分也不用裝Oracle客戶端),本來計劃的挺好的,覺得應該不會有太多問題。以前用WS都是用DataSet傳輸資料的,也沒有太關注過序列化的問題。而且也沒有用過Nhibernate真正的做過專案。

       現在問題就出來了,當我想用一個通用的方法接受Ws傳遞回來的物件資料,就發現有問題了。WS根本不能識別這些物件,換句專業的話說就是不能序列化。這個問題我問了TerryLee,以及其他一些人,都沒有找到好的解決方法。後來jickjick520告訴我在webmethod前面加特性[XmlInclude(typeof(myclass))].   的確是客戶端可以接受到。但是解決不了通用性的問題,因為這個相當於是硬編碼的,而且typeof(object)測試不能通過。也就是說假如客戶端用hql語句從WS處取得結果物件集,WS沒辦法傳遞回去。如果這個問題不解決,那麼就需要在WEB層定義好客戶端需要查詢的語句,直接讓客戶端傳遞引數進來,並且一個表就要對應N個Web方法,都要在方法前面加入[XmlInclude(typeof(XXX))].   實在是懶惰,終於測試了很多方法比如公共繼承等後,發現了一個還勉勉強強的方法:

       每次我們引用WS的時候,都會在當前應用程式下面生成一個資料夾,下面有reference.cs這個檔案,仔細觀察,就發現他生成的都是些代理方法,並且在最下面還會有一些返回自定義型別對應的類!有區別的是,這些類都沒有方法,只是一個個public的成員變數,也就是他把實體類public的R/W屬性對應成了成員變數。


      直入主題吧,呵呵。

     修改reference.cs檔案,在裡面增加我們需要返回的型別,仿照它自動生成的類(當然,必須是可以序列化的類)。那麼可以在WS處取得結果集後強制轉換成object傳過來,在這邊強制轉換回去,因為這邊已經定義了相應的類,所以就可以通過了,呵呵。但是要注意的一點就是每次重新引用的時候,你要儲存下來這些類,不然會被覆蓋。不知道我說的夠不夠清楚:)

     不知道大家誰還有其他更簡便的方法,可以告訴我:)