zoukankan      html  css  js  c++  java
  • 压缩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;

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

  • 相关阅读:
    2级搭建类203-Oracle 19c SI ASM 静默搭建(OEL7.7)
    2级搭建类EM-Oracle EMCC 13c Release 3 在 OEL 7.7 上的搭建
    1级搭建类112-Oracle 19c SI FS(CentOS 8)
    0级搭建类013-CentOS 8.x 安装
    List添加map,后添加的map覆盖前面的问题
    mysql插入数据报错1366
    oracle ora-12514解决办法
    easyUI 创建详情页dialog
    Server Tomcat v7.0 Server at localhost failed to start.
    maven项目启动报错;class path resource [com/ssm/mapping/] cannot be resolved to URL because it does not exist
  • 原文地址:https://www.cnblogs.com/findumars/p/5627548.html
Copyright © 2011-2022 走看看