Сохранение объекта в файл - PullRequest
10 голосов
/ 30 марта 2009

Как сохранить объект в его текущем состоянии в файл? Чтобы его можно было сразу прочитать и восстановить со всеми его переменными.

Ответы [ 7 ]

5 голосов
/ 30 марта 2009

Как уже говорилось, самый простой способ - использовать методы Stream и WriteComponent и ReadComponent .
Но имейте в виду , что:
- это работает для потомков TComponent , не простой TObject;
- только для опубликованных свойств (сохраненных в dfm), но не для общедоступных или (тем более) для приватных;
- вы должны обратить особое внимание на свойство Name при восстановлении компонента.

Вы можете найти код, который можно использовать в следующих ответах SO: Замена визуального компонента во время выполнения в Delphi , Дублирование компонентов во время выполнения

4 голосов
/ 30 марта 2009

Если вы удалили свой объект из TComponent, вы можете использовать некоторые встроенные функции для потоковой передачи объекта в файл. Я думаю, что это хорошо работает только для простых объектов.

Пример кода, с которого можно начать:

unit Unit1;

interface

uses
  Classes;

type
  TMyClass = class(TComponent)
  private
    FMyInteger: integer;
    FMyBool: boolean;
    FMyString: string;
  public
    procedure ToFile(AFileName: string);
  published
    property MyInteger: integer read FMyInteger write FMyInteger;
    property MyString: string read FMyString write FMyString;
    property MyBool: boolean read FMyBool write FMyBool;
  end;

implementation

{ TMyClass }

procedure TMyClass.ToFile(AFileName: string);
var
  MyStream: TFileStream;
begin
  MyStream := TFileStream.Create(AFileName);
  try
    Mystream.WriteComponent(Self);
  finally
    MyStream.Free;
  end;
end;

end.
4 голосов
/ 30 марта 2009

То, что вы ищете, называется постоянством объекта. Эта статья может помочь, и есть много других, если вы поищите в Google "постоянные объекты delphi".

2 голосов
/ 13 апреля 2009
  1. Очень простое и эффективное решение: Сериализатор класса DragonSoft XML
  2. Также вы можете использовать JVCL TJvAppXMLFileStorage:

    использование JvAppXMLStorage;

    var
      Storage: TJvAppXMLFileStorage;
    begin
      Storage := TJvAppXMLFileStorage.Create(nil);
      try
        Storage.WritePersistent('', MyObject);
        Storage.Xml.SaveToFile('S:\TestFiles\Test.xml');
        Storage.Xml.LoadFromFile('S:\TestFiles\Test.xml');
        Storage.ReadPersistent('', MyObject);
      finally
        Storage.Free;
      end;
    end;
    
2 голосов
/ 30 марта 2009

Существует также метод XML "по-своему" * здесь, на S.O.

1 голос
/ 30 марта 2009

Здесь есть хороший учебник . Помните, что для сохранения объекта во время выполнения необходимо использовать RTTI (информацию о типе времени выполнения), поэтому он будет захватывать только опубликованные свойства класса.

0 голосов
/ 31 марта 2009

Вы уже получили несколько хороших ответов на свой вопрос. В зависимости от того, что вы на самом деле делаете, может быть желательно использовать готовую библиотеку или компонент для сохранения объектов. Это недорогой и изящный набор библиотек / компонентов, который упрощает сохранение и восстановление объектов, и довольно легко (т. Е. С небольшим количеством кода) вмещает сохранение даже неопубликованных членов объекта: http://www.deepsoftware.ru/rsllib/index.html Не то, что является ракетостроением, но если вы делаете много такого рода вещей, этот компонент обеспечивает хорошую основу для этого.

Developer Express также включает в себя компонент cxPropertiesStore общего назначения как часть библиотеки ExpressEditors, которая поставляется с некоторыми из их компонентов.

...