日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

WCF学习笔记(二):在WCF中使用集合传输数据

發布時間:2023/11/27 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中使用集合传输数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。