2009-03-30 3 views
10

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

+0

Википедия говорит: «Множество значений атрибутов конкретного объекта называют его состояние.» Delphi фактически не имеет встроенного механизма для сохранения полного состояния объекта независимо от видимости, поддерживаются только опубликованные свойства. RTTI следует расширить, чтобы дополнительно включить все поля IMHO. – mjn

+0

Насколько эта ситуация обновлена? – PSyLoCKe

ответ

4

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

+1

Возможно, человек использовал Google, который указал ему на Stackoverflow. «Спросить Google» - не настоящий ответ. Ответ Francois - это REAL (и полезный) ответ. – Ampere

1

There is a good tutorial here. Имейте в виду, что вам необходимо иметь RTTI (информацию о типе времени выполнения) для сохранения объекта во время выполнения с использованием этого подхода, поэтому он будет записывать только свойств класса.

4

Если вы спускаете свой объект из 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

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

Вы можете найти код, который вы могли бы использовать в этих SO ответов: Replace visual component at runtime in Delphi, Duplicating components at Run-Time

-1

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

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

1
  1. Очень простое и эффективное решение: DragonSoft's XML Class Serializer
  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; 
    

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

  • Нет связанных вопросов^_^