博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
压缩OLEVARIANT数据
阅读量:4704 次
发布时间:2019-06-09

本文共 1567 字,大约阅读时间需要 5 分钟。

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

你可能感兴趣的文章
framework7 点取消后还提交表单解决方案
查看>>
JAVA Axis2调用WebService
查看>>
js学习---常用的内置对象(API)小结 :
查看>>
付费版百度指数 就是这么坑爹
查看>>
uva 116 Unidirectional TSP【号码塔+打印路径】
查看>>
关于android的2.2与4.4的文件读取的一点发现
查看>>
关于MAC的pkg和mpkg的分别
查看>>
11. 尽可能减少DB2的SQL请求
查看>>
MVC图片上传
查看>>
Hive优化(转)
查看>>
Android获取服务器Json字符串并显示在ListView上面
查看>>
4-13 杂记
查看>>
配置Spring数据源c3p0与dbcp
查看>>
uitabbarcontroller中 在设置tab bar item的image属性后不显示问题
查看>>
MVC静态化
查看>>
『MXNet』第十二弹_再谈新建计算节点
查看>>
『Numpy学习指南』排序&索引&抽取函数介绍
查看>>
WebApi用JilFormatter处理客户端序列化的字符串加密,之后在服务端解析。
查看>>
可左右滑动的选项卡
查看>>
缓存服务的更新策略有哪些?
查看>>