Сохранение TObject в файл

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


person Community    schedule 30.03.2009    source источник
comment
Википедия говорит: Набор значений атрибутов конкретного объекта называется его состоянием. На самом деле Delphi не имеет встроенного механизма для сохранения полного состояния объекта независимо от видимости, поддерживаются только опубликованные свойства. RTTI должен быть расширен, чтобы опционально включать все поля IMHO.   -  person mjn    schedule 31.03.2009
comment
Эта ситуация обновляется?   -  person Please_Dont_Bully_Me_SO_Lords    schedule 25.06.2014


Ответы (7)


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

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

person Francesca    schedule 30.03.2009

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

person Adrian Grigore    schedule 30.03.2009
comment
Вероятно, этот человек использовал Google, который указал ему на Stackoverflow. Спросить Google - это не настоящий ответ. Вместо этого ответ Франсуа - НАСТОЯЩИЙ (и полезный) ответ. - person Z80; 28.06.2014

Если вы наследуете свой объект от 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.
person Birger    schedule 30.03.2009

Здесь также есть самостоятельный метод XML здесь, на ТАК

person dwc    schedule 30.03.2009

  1. Очень простое и эффективное решение: Сериализатор классов XML от DragonSoft
  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;
    
person Z80    schedule 13.04.2009

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

person JosephStyons    schedule 30.03.2009

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

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

person Herbert Sitz    schedule 30.03.2009