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;

  • 相关阅读:
    装黑苹果遇到的术语
    关于Android方法数量限制的问题
    使用LeakCanary遇到的问题 就是不弹出来
    Android内存泄露自动检测神器LeakCanary
    Android开发常见的Activity中内存泄漏及解决办法
    LeakCanary 中文使用说明
    LeakCanary: 让内存泄露无所遁形
    LeakCanary——直白的展现Android中的内存泄露
    【腾讯Bugly干货分享】Android内存优化总结&实践
    Java基础--定时任务Timer
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2368612.html
Copyright © 2011-2022 走看看