压缩OLEVARIANT数据
TCLIENTDATASET.DATA, TCLIENTDATASET.DELTA, TDATASETPROVIDER.DATA,它们的DATA属性的类型都是OLEVARIANT。
中间层和客户端之间通过OLEVARIANT来传递数据集的数据。
为了提高数据传输的效率,发送方在传输之前可以先压缩数据,然后把压缩的数据发送给接收方。
接收方收到发送方送来的压缩数据,先进行数据解压。
使用开源的ZLIB进行数据的压缩和解压。XE2已经自带此控件,需要引用system.zlib单元。
原理:将OLEVARIANT数据流化,然后对流进行压缩,还原成OLEVARIANT以后再发送。
procedure StreamToVariant(Stream: TStream; var V: OLEVariant);
var
P : Pointer;
begin
try
V := VarArrayCreate ([0, Stream.Size - 1], varByte);
P := VarArrayLock (V);
Stream.Position := 0;
Stream.Read (P^, Stream.Size);
VarArrayUnlock (V);
except
Exit;
end;
end;
procedure VariantToStream(const V: OLEVariant; Stream: TStream);
var
P: Pointer;
begin
try
Stream.Position := 0;
Stream.Size := VarArrayHighBound (V, 1) - VarArrayLowBound (V, 1) + 1;
P := VarArrayLock (V);
Stream.Write (P^, Stream.Size);
VarArrayUnlock (V);
Stream.Position := 0;
except
Exit;
end;
end;
function CompressData(V: OleVariant): OleVariant;
var
M, M0: TMemoryStream;
begin
try
M := TMemoryStream.Create;
M0 := TMemoryStream.Create;
try
if V = Null then exit;
VariantToStream(V,M);
M.Position := 0;
ZCompressStream(M, M0);
StreamToVariant(M0, V);
finally
M.Free;
M0.Free
end;
Result := V;
except
Exit;
end;
end;
function DeCompressData(V: OleVariant): OleVariant;
var
M, M0: TMemoryStream;
begin
try
M := TMemoryStream.Create;
M0 := TMemoryStream.Create;
try
if V = Null then exit;
VariantToStream(V,M);
M.Position := 0;
ZDeCompressStream(M, M0);
StreamToVariant(M0, V);
finally
M.Free;
M0.Free
end;
Result := V;
except
Exit;
end;
end;
本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/archive/2012/02/26/2368612.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?