WCF学习笔记(二):在WCF中使用集合传输数据
最近的開發,一直被DataContract頭疼,微軟為了更好的通用性和代碼無關性,將DataContract進行了一系列的優化,使作為DataContract的類在進行Serialize的時候會被序列化成非常通用的數據格式,可以在任何開發語言中調用。但是我們是僅僅使用C#進行客戶端和服務器端的開發,而且客戶端和服務器端交換的數據是同一個類型。
剛開始我的代碼是這樣寫的:
using System; using System.Collections; using System.ServiceModel; using System.Runtime.Serialization;namespace JCDEV.WCF.Test1 {[DataContract]public class Message{private DataCommandCollections list;[DataMember]public DataCommandCollections List{get { return list; }set { list = value; }}}[DataContract]public class DataCommandCollections : CollectionBase{[DataMember]public IList List{get{return base.InnerList;}}}[DataContract]public class DataCommand{ //代碼省略...} }
我的本意是傳遞Message類,類中包含一個DataCommand的數組,但是這樣做的結果是,生成的客戶端代碼中DataCommandCollections被修正為了一個object[],而DataCommand未被序列化。我總結一下原因是:DataCommandCollections集成于CollectionBase,該類是一個Collection的基類,內部有一個ArrayList數組,該數組默認是實現IList接口的,內部數據是Object型,所以在序列化是就生成了Object[],而不管實際的內部數據是何類型。
到這里我分析,DataContract在客戶端生成代碼時是根據其內部參數的類型來決定的。因此數組必須顯性設置為DataCommand的數組,否則都將無法生成正確的代碼。
解決該問題的方法是使用List<T>來作為父類,該類通過泛型的方式指定其內部參數,下面是我改進的程序:
using System; using System.Collections; using System.ServiceModel; using System.Runtime.Serialization; using System.Collections.Generic;namespace JCDEV.WCF.Test1 {[DataContract]public class Message{private DataCommandCollections list;[DataMember]public DataCommandCollections List{get { return list; }set { list = value; }}}[DataContract]public class DataCommandCollections :List<DataCommand>{//代碼省略... }[DataContract]public class DataCommand{ //代碼省略...} }
程序改進后在生成客戶端時出錯,查了下原因是因為如果類實現了IEnumable接口時,.Net會默認將他作為一個Collections類來進行序列化,無需指定他為DataContract,如果需自定義,應該使用CollectionDataContract特性。將代碼修改后就沒有錯誤了。客戶端正確的生成了一個DataCommand[]和DataCommand類。
但是這樣生成的客戶端代碼其實并沒有什么用,因為客戶端本來就可以直接調用Message類,后來一個偶然的機會,我發現了一個新的方法,就是在客戶端添加服務引用時,選擇高級,然后將重新使用引用的程序集中的類型勾選上,這樣客戶端就不會生成一個Message類,而是直接使用自己引用的Message類了,如圖:
這里也可以設置對于集合類型,在客戶端解析后的生成方式,默認是生成一個數組。
這里要注意一點,當使用重引用選項后,DataContract將無法使用,出的錯誤是“類型未被標示為可序列化”,我是使用Serializable來代替的,這個原因是什么我還不清楚,如果有人知道,希望也告訴我一下,謝謝。
補充一下:“類型未被標示為可序列化”原因找到了,是我疏忽的錯誤,呵呵,原因是我有一個對Message類進行序列化的函數,程序時在這里提示的錯誤。DataContract是可以使用的。至于.Net如何對集合進行操作,我將稍候發布。
轉載于:https://www.cnblogs.com/jcdev/archive/2009/11/17/1604602.html
總結
以上是生活随笔為你收集整理的WCF学习笔记(二):在WCF中使用集合传输数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上海欢乐谷里面有什么吃的么
- 下一篇: 眼是水波横的下一句是什么呢?