Сжимайте TComponents при записи их в TStream

Некоторые приложения, которые мы используем, зависят от потомков 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 чтение/запись?

Спасибо


person Lepidosteus    schedule 21.05.2009    source источник


Ответы (1)


TComponent, по-видимому, хочет иметь возможность искать в потоке, из которого он читает или в который записывает, и вы обычно не можете сделать это со сжатыми потоками — по крайней мере, не в обратном направлении. После того как вы прочитали байт, вы не можете вернуться и прочитать его снова, потому что именно то значение, которое вы получите, может зависеть от всего содержимого потока, которое в первую очередь привело к этому байту. Поиск назад для повторного чтения одного байта может означать повторное чтение всего потока. А для записи, чтобы вернуться и «подправить» какую-то область потока, изменение одного байта означало бы необходимость повторного сжатия всего, что было после него. Итак, вы можете понять, почему сжатые потоки не любят искать назад.

Запишите свои данные в TMemoryStream, а затем скопируйте содержимое этого потока в сжатый поток. Чтобы прочитать, скопируйте поток декомпрессии в TMemoryStream, а затем загрузите оттуда свои компоненты. (Не забудьте установить свойство Position обратно в ноль перед загрузкой компонента из потока памяти.)

person Rob Kennedy    schedule 21.05.2009
comment
Как всегда, хорошее объяснение, дополняющее решение. Престижность. - person mghie; 22.05.2009