在TStream中编写TComponents时压缩它们

Lep*_*eus 5 compression delphi

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

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

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

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

谢谢

Rob*_*edy 14

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

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