線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1958
推到 Plurk!
推到 Facebook!

如何将Variant形态的Delta放进TStream里去?

答題得分者是:jieshu
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-22 18:40:26 IP:218.17.xxx.xxx 未訂閱
三层的客户端提交给服务器端的数据是TClientDataSet.Delta,这是一个OleVariant类型的数据。 为传输效率起见,我想用ZLib来压缩它。但ZLib压缩的是TStream。 那么,该怎样把Delta里的数据读进TStream里去,到了服务器端,又如何从解压缩后的TStream里把数据恢复回Variant类型的Delta里? 我试过 MyMemoryStream.Write(Delta, Length(Delta));,但写进TStream里的DELTA数据我保存到文件里打开来看,似乎并不完整。 当然,变通的办法是先把DELTA给另一个ClientDataSet.Data,然后读这个ClientDataSet.XMLData,这是个字符串,就好处理了。 但我想知道直接的处理办法。总结为:如何将Variant类型的数据与TStream类型互相转换。
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-22 19:32:07 IP:203.204.xxx.xxx 未訂閱
引言: 三层的客户端提交给服务器端的数据是TClientDataSet.Delta,这是一个OleVariant类型的数据。 为传输效率起见,我想用ZLib来压缩它。但ZLib压缩的是TStream。 那么,该怎样把Delta里的数据读进TStream里去,到了服务器端,又如何从解压缩后的TStream里把数据恢复回Variant类型的Delta里? 我试过 MyMemoryStream.Write(Delta, Length(Delta));,但写进TStream里的DELTA数据我保存到文件里打开来看,似乎并不完整。 当然,变通的办法是先把DELTA给另一个ClientDataSet.Data,然后读这个ClientDataSet.XMLData,这是个字符串,就好处理了。 但我想知道直接的处理办法。总结为:如何将Variant类型的数据与TStream类型互相转换。
用SocketConnection的InterceptGUID即可,Delphi有範例,所有的傳輸都可壓縮。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-23 14:14:05 IP:218.18.xxx.xxx 未訂閱
引言: 用SocketConnection的InterceptGUID即可,Delphi有範例,所有的傳輸都可壓縮。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
谢谢! 但如果不用SocketConnection呢?我想寻求一种方法,可以将TStream和Variant互相转换。 目前暂时对我来说,我可以这样: ClientDataSet2.Data:=ClientDataSet1.Delta; ClientDataset2.SaveToStream(myStream); 用这个办法把Detal保存到TStream里。
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-23 14:30:27 IP:203.204.xxx.xxx 未訂閱
引言: 但如果不用SocketConnection呢?我想寻求一种方法,可以将TStream和Variant互相转换。 目前暂时对我来说,我可以这样: ClientDataSet2.Data:=ClientDataSet1.Delta; ClientDataset2.SaveToStream(myStream); 用这个办法把Detal保存到TStream里。
這我就沒研究了,也需您可以參考Delphi的Source Code,看他這段是如何做的,不過您的做法也蠻不錯的,簡單易懂!
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-24 00:25:31 IP:219.133.xxx.xxx 未訂閱
今天试验了一个办法,就是利用字符串来传递ClientDataSet.Data,而且不是用XMLData,是直接传递OleVariant形态的Data. 发送端: ClientDataSet1.SaveToStream(Stringstream); S:=StringStream.DataString; EncodeString(S); //<----将S转换为Base64 Encoding,以合适用WebServices传送。 接收端,接收到S后: S:=DecodeString(S); //<---------Base64 Decoding StringStream.Create(S); ClientDataset.LoadFromStream(StringStream); 这样做是成功的。 那么,对于Delta,因为没有类似ClientDataSet.SaveDeltaToStream的Function可以使用,所以必须先将Delta给另一个ClientDataSet2.Data:=ClientDataSet1.Delta,然后再将ClientDataSet2.SaveToStream(),这样来将Delta送给服务器端提交到DataBase.
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-24 09:50:36 IP:203.204.xxx.xxx 未訂閱
引言: 今天试验了一个办法,就是利用字符串来传递ClientDataSet.Data,而且不是用XMLData,是直接传递OleVariant形态的Data. 发送端: ClientDataSet1.SaveToStream(Stringstream); S:=StringStream.DataString; EncodeString(S); //<----将S转换为Base64 Encoding,以合适用WebServices传送。 接收端,接收到S后: S:=DecodeString(S); //<---------Base64 Decoding StringStream.Create(S); ClientDataset.LoadFromStream(StringStream); 这样做是成功的。 那么,对于Delta,因为没有类似ClientDataSet.SaveDeltaToStream的Function可以使用,所以必须先将Delta给另一个ClientDataSet2.Data:=ClientDataSet1.Delta,然后再将ClientDataSet2.SaveToStream(),这样来将Delta送给服务器端提交到DataBase.
感謝您的分享! 請問用WebServices傳送,只能用Base64嗎?據我所知Base64編碼過後,內容會變大,而且也會增加些時間。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-03-24 13:44:49 IP:61.141.xxx.xxx 未訂閱
引言: 請問用WebServices傳送,只能用Base64嗎?據我所知Base64編碼過後,內容會變大,而且也會增加些時間。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。[/green] 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
我试验了一下,把一个ClientDataSet.Data保存为文件是4.64K 把它取出来用Zlib压缩后再编码成Base64然后再保存为文件,是1.59K 看起来,只要先压缩再编码,还是比原来的不压缩的Data小很多。这样应该可以提高网络上的传输速度。当然要消耗SERVER的CPU资源。
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-03-26 15:49:20 IP:203.204.xxx.xxx 未訂閱
引言: 我试验了一下,把一个ClientDataSet.Data保存为文件是4.64K 把它取出来用Zlib压缩后再编码成Base64然后再保存为文件,是1.59K 看起来,只要先压缩再编码,还是比原来的不压缩的Data小很多。这样应该可以提高网络上的传输速度。当然要消耗SERVER的CPU资源。
嗯,經過壓縮是會比較小,不過做了這麼多事,如果資料量大的話,恐怕會影響效能。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
系統時間:2024-03-29 22:11:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!