我们使用的一些应用程序依赖于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读/写?
由于
答案 0 :(得分:14)
TComponent
显然希望能够在它读取或写入的流中寻找,而你通常不能用压缩流来做 - 至少不是落后的。一旦你读了一个字节,你就不能再回去再读它,因为你得到的确切值取决于首先导致该字节的整个流内容。向后寻找重新读取一个字节可能意味着重新读取整个流。对于写入,要返回并“修复”流的某个区域,更改一个字节意味着需要重新压缩它之后的所有内容。所以你可以看到为什么压缩流不喜欢向后搜索。
将您的数据写入TMemoryStream
,然后将该流的内容复制到压缩流中。要阅读,请将解压缩流复制到TMemoryStream
,然后从那里加载组件。 (在将组件加载到内存流之前,不要忘记将Position
属性设置为零。)