如何将Variant形态的Delta放进TStream里去? |
答題得分者是:jieshu
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
三层的客户端提交给服务器端的数据是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 發送簡訊給我 |
引言: 三层的客户端提交给服务器端的数据是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.taconet.com.tw/jieshu/ |
||
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
引言: 用SocketConnection的InterceptGUID即可,Delphi有範例,所有的傳輸都可壓縮。谢谢! 但如果不用SocketConnection呢?我想寻求一种方法,可以将TStream和Variant互相转换。 目前暂时对我来说,我可以这样: ClientDataSet2.Data:=ClientDataSet1.Delta; ClientDataset2.SaveToStream(myStream); 用这个办法把Detal保存到TStream里。 |
||
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 但如果不用SocketConnection呢?我想寻求一种方法,可以将TStream和Variant互相转换。 目前暂时对我来说,我可以这样: ClientDataSet2.Data:=ClientDataSet1.Delta; ClientDataset2.SaveToStream(myStream); 用这个办法把Detal保存到TStream里。這我就沒研究了,也需您可以參考Delphi的Source Code,看他這段是如何做的,不過您的做法也蠻不錯的,簡單易懂!
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
||
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
今天试验了一个办法,就是利用字符串来传递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 發送簡訊給我 |
引言: 今天试验了一个办法,就是利用字符串来传递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.taconet.com.tw/jieshu/ |
||
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
引言: 請問用WebServices傳送,只能用Base64嗎?據我所知Base64編碼過後,內容會變大,而且也會增加些時間。我试验了一下,把一个ClientDataSet.Data保存为文件是4.64K 把它取出来用Zlib压缩后再编码成Base64然后再保存为文件,是1.59K 看起来,只要先压缩再编码,还是比原来的不压缩的Data小很多。这样应该可以提高网络上的传输速度。当然要消耗SERVER的CPU资源。 |
||
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 我试验了一下,把一个ClientDataSet.Data保存为文件是4.64K 把它取出来用Zlib压缩后再编码成Base64然后再保存为文件,是1.59K 看起来,只要先压缩再编码,还是比原来的不压缩的Data小很多。这样应该可以提高网络上的传输速度。当然要消耗SERVER的CPU资源。嗯,經過壓縮是會比較小,不過做了這麼多事,如果資料量大的話,恐怕會影響效能。
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |