好久没来这里更新了!糊乱讲点啥吧!

       .net的最强势就是使得数据在Internet上自由传输。
和远程数据库打交道,很多.net的项目都用到了WebService,WebService除了可以传输一些基本的类型:int、Byte、string等等,还可以传输那些可以XML序列化的对象,比如DataSet!
Dataset定义如下:

1[Visual Basic]
2<Serializable>
3Public Class DataSet
4   Inherits MarshalByValueComponent
5   Implements IListSource, ISupportInitialize, ISerializable

当然你也可以定义自己的实体,只要它可以XML序列化都可以在Internet上传输。通过一段时间用下来,发现通过WebService传输Dataset,或自己定义的实体,如果Client用户很多,往往会使IIS占用大量内存,而且速度也很慢。这时,我们潜意识中会想到压缩,既然问题出来了,为什么不压缩呢?压缩在中国可是有悠久的历史了,由于带宽太窄,所以下载的文件都是经过压缩的。

一般的思路就是压缩成二进制。谷歌一下,发现黎波兄的文章。
  http://www.cnblogs.com/upto/archive/2006/04/10/compresswebservice.html
把他的代码编译成了DLL,抽象出两个方法

 1
 2    ''' 压缩Dataset
 3   Public Shared Function Compress(ByVal data As DataSet) As Byte()
 4
 5        Dim dss As New DataSetSurrogate(data)
 6        Dim ser As New BinaryFormatter
 7        Dim ms As New MemoryStream
 8        ser.Serialize(ms, dss)
 9        Dim buffer As Byte() = ms.ToArray()
10
11        Dim zipBuffer As Byte() = New CompressionHelper(CompressionLevel.BestSpeed).CompressToBytes(buffer)
12
13        Return zipBuffer
14
15    End Function
16
17    '解压缩Dataset
18    Public Shared Function DeCompress(ByVal data As Byte()) As DataSet
19
20        Dim buffer As Byte() = New CompressionHelper(CompressionLevel.BestSpeed).DecompressToBytes(data)
21        Dim ser As New BinaryFormatter
22        Dim ms As New MemoryStream(buffer)
23
24        'Return ser.Deserialize(ms)
25        Return CType(ser.Deserialize(ms), DataSetSurrogate).ConvertToDataSet
26
27    End Function

Demo 结构如下,请把CompresDataWithDotNet1.1WebService工程搞成Webservice


Demo是从Wevservice中取100000条数据,未压缩数据可压缩数据的比较!
压缩效果图:


大功告成!!

我原先对黎波兄的DataSetSurrogate这个类感到奇怪,直接Dataset序列化不就完了吗?为什么还要用DataSetSurrogate这个中间"层"?
我试了一下把DataSetSurrogate去掉,直接DataSet序列化,结果是发现速度超慢,把时间都用在序列化上面了!


源码下载


后继:

压缩并不局限于Dataset,把程序稍微改一改,可以压缩你定义的序列化实体!
你也可以加入一些数据加密解密的算法!
最近在学习.net 2.0,发现.net 2.0自带一些类,实现压缩,比如GZipStream压缩类,压缩比更高,数据更快,我会继续<<compress DataSet with .net 2.0>>,还有数据加密RSACryptoServiceProvider!


posted on 2006-09-29 15:10 MasterCai 阅读(1768) 评论(3)  编辑 收藏 所属分类: VB.NetASP.net.net FrameworkVC#.net

  回复  引用    
2006-09-29 18:40 | jameswei [未注册用户]
使用DataSetSurrogate的目的是因为dotnet1.x的dataset不支持二进制序列化
5861626atsinadotcom

  回复  引用  查看    
2006-09-30 20:59 | U2U      
一般
  回复  引用    
2007-01-22 10:54 | 木头[匿名] [未注册用户]
jameswei
使用DataSetSurrogate的目的是因为dotnet1.x的dataset不支持二进制序列化
5861626atsinadotcom

你说错了,dotnet1.x的dataset支持二进制序列化,但是其应该是先XML化再二进制化,序列化后的数据体太庞大了,而DataSetSurrogate对dataset是真正意义上的序列化。

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-09-29 15:12 编辑过


相关链接: