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;

http://www.cnblogs.com/hnxxcxg/archive/2012/02/26/2368612.html

压缩OLEVARIANT数据的更多相关文章

  1. 压缩Sqlite数据文件大小,解决数据删除后占用空间不变的问题

    最近有一网站使用Sqlite数据库作为数据临时性的缓存,对多片区进行划分 Sqlite数据库文件,每天大概新增近1万的数据量,起初效率有明显的提高,但历经一个多月后数据库文件从几K也上升到了近160M ...

  2. hive 压缩全解读(hive表存储格式以及外部表直接加载压缩格式数据);HADOOP存储数据压缩方案对比(LZO,gz,ORC)

    数据做压缩和解压缩会增加CPU的开销,但可以最大程度的减少文件所需的磁盘空间和网络I/O的开销,所以最好对那些I/O密集型的作业使用数据压缩,cpu密集型,使用压缩反而会降低性能. 而hive中间结果 ...

  3. php curl采集,服务器gzip压缩返回数据怎么办

    一般服务器不会胡乱返回gzip压缩的数据,一般是客户端请求的头部里包含你浏览器能接受的压缩方式, Accept-Encoding:gzip,deflate,sdch   这里是gzip .deflat ...

  4. 【mysql】压缩myisam数据表

    myisam引擎介绍 存储结构: MyISAM每张表被存放在三个文件: frm:表格定义: MYD(MYData):数据文件: MYI(MYIndex):索引文件:   存储空间: MyISAM可被压 ...

  5. WebApi Gzip(Deflate) 压缩请求数据

    由于不能直接访问指定数据库,只能通过跳板机查询Oracle数据,所以要做一个数据中转接口, 查询数据就要压缩,于是就找资料,代码如下,其中要注意的是Response.Headers.Remove(&q ...

  6. Spark- Spark从SFTP中读取zip压缩文件数据做计算

    我们遇到个特别的需求,一个数据接入的流程跑的太慢,需要升级为用大数据方式去处理,提高效率. 数据: 数据csv文件用Zip 压缩后放置在SFTP中 数据来源: SFTP 数据操作: 文件和它的压缩包一 ...

  7. 关于LZO无法平台上压缩,但是数据需要使用平台压缩的问题解决

    我们做hive查询时候经常会出现出数过慢的问题,于是采用了LZO压缩,再在压缩块上做索引的方式去解决这个问题,但是也引入了新的问题点 lzo本身的压缩功能只能在linux上压缩再上传到HDFS平台,供 ...

  8. 服务端OLEVARIANT数据之后传输

    将OLEVARIANT数据流化,然后对流进行压缩,还原成OLEVARIANT以后再发送. procedure StreamToVariant(Stream: TStream; var V: OLEVa ...

  9. InnoDB 数据表压缩原理与限制

    http://liuxin1982.blog.chinaunix.net/uid-24485075-id-3523032.html 压缩理念 通过提高CPU利用率和节约成本,降低数据库容量及I/O负载 ...

随机推荐

  1. 库函数strlen源码重现及注意问题

    首先直接上源码: size_t strlen (const char * str) { const char *eos = str; while(*eos++); return(eos - str - ...

  2. smarty 判断变量是否为空

    {if $val.title!=""} 这里填写想要输出的内容即可 {/if}

  3. 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法(android)

    final double x_pi = 3.14159265358979324 * 3000.0 / 180.0; public GeoPoint bd_encrypt(GeoPoint point) ...

  4. JLINK烧写BIN文件到nand、norflash、SDRAM

    1. 简要说明 JLink的调试功能.烧写Flash的功能都很强大,但是对于S3C2410.S3C2440的Flash操作有些麻烦:烧写Nor Flash时需要设置SDRAM,否则速率很慢:烧写Nan ...

  5. 当Evernote结合MindManager

    最近潜心研究Evernote(印象笔记)在数据存储和GTD规划方面的运用,感觉到的震撼和惊艳,一如当初开始接触MindManager的时候! 我非常喜欢这个SaaS的软件,以至于我将我国际版的Ever ...

  6. 跨平台的C++应用和UI开发库 QT

    跨平台的C++应用和UI开发库 QT 运行环境: 授权方式:BSD 软件大小:M 下载量:3912 更新日期:2012-04-05 来源地址: 联系作者:Linux     Qt是诺基亚开发的一个跨平 ...

  7. 用gdb调试程序笔记: 以段错误(Segmental fault)为例

    用gdb调试程序笔记: 以段错误(Segmental fault)为例[转] 1.背景介绍2.程序中常见的bug分类3.程序调试器(如gdb)有什么用4.段错误(Segmental fault)介绍5 ...

  8. 《windows核心编程系列》二谈谈ANSI和Unicode字符集 .

    http://blog.csdn.net/ithzhang/article/details/7916732转载请注明出处!! 第二章:字符和字符串处理 使用vc编程时项目-->属性-->常 ...

  9. Codeforces 286E

    #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> # ...

  10. POJ 3111 K Best(二分答案)

    [题目链接] http://poj.org/problem?id=3111 [题目大意] 选取k个物品,最大化sum(ai)/sum(bi) [题解] 如果答案是x,那么有sigma(a)>=s ...