分享
 
 
 

WebService传输DataSet的一点想法和实践

王朝other·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

其实这个标题很大,实现起来也可以有许多的办法。甚至,应否这样做也许都能惹出许多的争论(比如,为什么用WS而不是Remoting? 为什么传DataSet而不是Entity[]?)。

由于DS的体态丰腴,选用何种序列化就很多的选择了,我尝试过如下方法:

1, SOAPFomatter

2, BinaryFomatter

3,SOAPFomatter + SharpZipLib

4,BinaryFomatter+ SharpZipLib

5, DataSetSurrogate (http://support.microsoft.com/default.aspx?scid=kb;en-us;829740

6, DataSetSurrogate + SharpZipLib

7, PAB.CompressDataSet.Wrapper (http://www.eggheadcafe.com/articles/20031219.asp)

若论压缩效果,第7种办法是最优秀的,第2名是第6种办法。

若论速度,第7种和第6种几乎差不多。。。(最快的好像是第2种)

(区区年前曾做了一个详细的工程,分别用100/1000/10000条纪录对上述方法进行测试,然该工程很可能丢到抓娃国了,故详细数据暂且欠奉,待找回后当补充之)

PAB.CompressDataSet.Wrapper 据上文所说,乃是通过反向工程.NET Compact Framework而得到的压缩代码,我估计它也采用了类似于DataSetSurrogate那样的替代对象来存储。本来我是很倾向使用这个方法的,可惜这个咚咚没有源码(且DLL加了混淆)。。。而反观第6种,我们则可以轻松坐拥全部源码,所以最后我还是选择了第6种办法的。下面的一点代码,可供各位晒笑:

using System;

using System.IO;

using System.Runtime.Serialization.Formatters.Binary;

using System.Xml.Serialization;

using System.Data;

using ICSharpCode.SharpZipLib.Checksums;

using ICSharpCode.SharpZipLib.Zip;

using ICSharpCode.SharpZipLib.GZip;

/// <summary>

/// 压缩数据集

/// </summary>

/// <param name="ds"></param>

/// <returns></returns>

public static byte[] CompressDS(DataSet ds)

{

MemoryStream ms = new MemoryStream();

ZipOutputStream zos = new ZipOutputStream(ms);

zos.PutNextEntry(new ZipEntry(ds.DataSetName));

BinaryFormatter bf = new BinaryFormatter();

DataSetSurrogate dss = new DataSetSurrogate(ds);

bf.Serialize(zos, dss);

zos.CloseEntry();

zos.Close();

byte[] ret = ms.ToArray();

ms.Close();

return ret;

}

/// <summary>

/// 解压数据集

/// </summary>

/// <param name="byt"></param>

/// <returns></returns>

public static DataSet DecompressDS(byte[] byt)

{

MemoryStream ms = new MemoryStream(byt);

BinaryFormatter bf = new BinaryFormatter();

ZipInputStream zis = new ZipInputStream(ms);

zis.GetNextEntry();

DataSetSurrogate dss = (DataSetSurrogate)bf.Deserialize(zis);

zis.Close();

ms.Close();

DataSet ds = dss.ConvertToDataSet();

return ds;

}

基于SharpZipLib实现上面两个函数后,DS压缩的任务就完成了。BTW,VS2005里边,.NET FW 自带了CompressStream,我们可以跟SharpZipLib说再见了:)

至于WS怎么传输,在CSDN上看到Tomgus (小桥流水) 老兄转载的http://www.cnblogs.com/flyskywlh/archive/2005/08/18/217382.html,乃Flyskywlh老兄的大作。

首先我也很同意使用byte[]数组传输,非常方便。至于具体WebMethod的方式,我在实际应用中是大量使用实体WebMthod的,比如:

[WebMethod]

public DataSet GetOrders() {}; //获取所有订单

[WebMethod]

public DataSet UpdateOrders(DataSet dsOrders){}; //更新指定订单

因为采取这种模式,所以系统里边有极多的WebMethod(WinformUI仅通过WS交互),一个标准WM的调用流程是:

客户端压缩WM中所有DS型的参数-〉调用WM-〉服务器端解压所有DS型的参数-〉执行实际WM-〉对DS型的返回值进行压缩-〉客户端接收并解压得出结果DS

上述流程的具体实现很麻烦,在客户端用了AOP的透明代理的概念;服务器端则用了动态调用WS的技术。实现这种“双代理”的模式后,对于WS端或Winform端,压缩与不压缩变得透明了,两方面的程序员都不用再关心这个问题了。而且我觉得“双代理”还可以为我们处理其他很多的问题,比如排队,异步操作,权限等等。那位朋友||大拿||高人有兴趣探讨这个问题的,小可甚喜!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有