在Stream中编写组件时压缩组件

时间:2009-05-21 21:38:12

标签: delphi compression

我们使用的一些应用程序依赖于TComponent后代,在Write / ReadComponentResFile的帮助下轻松保存/加载其内部对象的状态

function TSomeClass.SaveState: boolean;
begin
  ...
  try
    ...
    WriteComponentResFile(self.f_path, TComponent(self));
    result := true;
  except   
    result := false;
  end;
  ....
end;

现在我们想要压缩这些数据,但由于某种原因,我一直无法找到使用JCL bzip2流类编写类似函数的方法,有关搜索操作不受支持的内容

由于我不是TStream专家,我想知道实现这种压缩的最简单方法;使用TComponent读/写?

由于

1 个答案:

答案 0 :(得分:14)

TComponent显然希望能够在它读取或写入的流中寻找,而你通常不能用压缩流来做 - 至少不是落后的。一旦你读了一个字节,你就不能再回去再读它,因为你得到的确切值取决于首先导致该字节的整个流内容。向后寻找重新读取一个字节可能意味着重新读取整个流。对于写入,要返回并“修复”流的某个区域,更改一个字节意味着需要重新压缩它之后的所有内容。所以你可以看到为什么压缩流不喜欢向后搜索。

将您的数据写入TMemoryStream,然后将该流的内容复制到压缩流中。要阅读,请将解压缩流复制到TMemoryStream,然后从那里加载组件。 (在将组件加载到内存流之前,不要忘记将Position属性设置为零。)