2010-05-25 2 views
2

Мне нужно сохранить несколько объектов (большинство из них - TObject/non persistent) до TMemoryStream, сохранить поток на диск и загрузить его обратно. Объекты должны быть переданы один за другим. Какой-то универсальный контейнер.Поток нескольких TObjects в TMemoryStream

В настоящее время я помещаю все свойства/поля/переменные объекта в запись и сохраняю запись в поток. Но я намерен использовать функции file WriteInterger, WriteString (см. Ниже), WriteBoolean и т. Д. Функции для сохранения/загрузки данных из потока.

StreamReadString(CONST MemStream: TMemoryStream): string; 
StreamWriteString(CONST MemStream: TMemoryStream; s: string); 

Однако, похоже, мне нужно переписать много кода. Один из многих примеров - TStringList.LoadFromStream, который не будет работать, поэтому его необходимо переписать. Это связано с тем, что TStringList должен быть последним объектом в потоке (он читается с текущей позиции до конца потока).

Кто-нибудь знает библиотеку, которая предоставляет базовые функции, подобные этому?


Я использую Delphi 7, поэтому RTTI не так уж хорош.

ответ

1

Показать похожие сообщению here

Btw, Delphi7 также имеет поддержку RTTI, в противном случае ваши формы (.dfm) не может быть загружен :-)
При использовании опубликованных свойств, RTTI будет работать для вас «из коробка".
В противном случае вы должны сделать это самостоятельно с

procedure DefineProperties(Filer: TFiler); override;

Вы посмотрите на то, как это реализовано в возможности:

procedure TDataModule.DefineProperties(Filer: TFiler); 

Это единственный способ для сериализации объекта.
Но вы также можете попробовать записи: если вы не используете массив (строки также массивы символов) или свойства объекта, вы можете напрямую сохранить и загрузить запись в память (поток, файл и т. Д.). Я использую это в своем AsmProfiler, чтобы иметь возможность читать и записывать многие (небольшие) результаты очень быстро (массив записей с целыми значениями может быть сохранен и загружен одним вызовом Move/CopyMemory!).

+0

На данный момент я поместил все свойства/поля/переменные объекта в запись и сохранил запись в потоке. Но я намерен использовать функции Write Writeer, WriteString, WriteBoolean и т. Д. Для сохранения/загрузки данных из потока. – Ampere

1

Какая версия Delphi? Delphi 2010 имеет новую функциональность RTTI, поэтому вы можете использовать DeHL, который имеет «полную родовую сериализацию для всех включенных типов и коллекций».

+0

Извините. Я забыл добавить: Delphi 7. – Ampere

+1

Хорошо, тогда вы можете попробовать «http://opensource.hitsoft-it.com/display/HitXMLe/General+Description» (мы используем это в D2007 для сериализации в xml) –

1

Почему бы не использовать XML?

  1. Напишите XSD для XML, который определяет XML.
  2. Создайте единицу формы Delphi, которая XSD использует мастер привязки данных XML.
  3. Поместите кучу ваших объектов в этот XML.
  4. Сохраните XML на диск (или переведите его на другой носитель).

Дополнительную информацию о XML и Мастер привязки данных XML см. В разделе this answer.

Edit:

Просто сопоставить объекты к интерфейсам/объектов, созданных из XSD; или использовать создаваемые объекты/интерфейсы.

Это, как правило, намного проще, чем подключение к потолочному механизму Delphi (путем написания оболочек TPersistent с опубликованными свойствами вокруг ваших объектов, идущих по пути DefineBinaryProperty или пути TReader/TWriter/DefineProperty).

--jeroen

+0

Будет ли это Работа с XML с не опубликованными свойствами и не постоянными классами, такими как TObject? Я также обеспокоен размером созданного файла, который может быть в несколько раз больше, чем двоичный файл. – Ampere

+0

Wow: кому-то определенно не нравится XML и downvoted me :-) –

1

Вы думали об использовании путника и TWriter, чтобы заполнить свои потоки.

Смежные вопросы