Сохранить / загрузить TObject(TPersistent) в XML
Все.
Я пытаюсь сохранить свой класс:
TA= class(TPersistent)
private
FItems: TObjectList<TB>;
FOnChanged: TNotifyEvent;
public
constructor Create;
destructor Destroy; override;
...
procedure Delete(Index: Integer);
procedure Clear;
procedure SaveToFile(const FileName: string);
...
property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;
end;
подать, используя следующий код:
var
Storage: TJvAppXMLFileStorage;
begin
Storage := TJvAppXMLFileStorage.Create(nil);
try
Storage.WritePersistent('', Self);
Storage.Xml.SaveToFile(FileName);
finally
Storage.Free;
end;
но файл всегда пуст.
Что я делаю не так?
2 ответа
Похоже, что TJvCustomAppStorage не поддерживает Generics в свойствах. Код не использует расширенный RTTI, и вызов TJvCustomAppStorage.GetPropCount возвращает 0.
Это приводит к другому вопросу - существуют ли библиотеки сериализации объектов Delphi с поддержкой Generics??
Мой тестовый код:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Classes, Generics.Collections, JvAppXmlStorage;
type
TA = class(TPersistent)
private
FItems: TObjectList<TPersistent>;
public
constructor Create;
published
property
Items: TObjectList < TPersistent > read FItems write FItems;
end;
{ TA }
constructor TA.Create;
begin
FItems := TObjectList<TPersistent>.Create;
end;
var
Storage: TJvAppXMLFileStorage;
Test: TA;
begin
Test := TA.Create;
Test.Items.Add(TPersistent.Create);
Storage := TJvAppXMLFileStorage.Create(nil);
try
Storage.WritePersistent('', Test);
WriteLn(Storage.Xml.SaveToString);
ReadLn;
finally
Storage.Free;
end;
end.
Я не уверен, но если TJvAppXMLFileStorage использует RTTI, то я думаю, что вы должны опубликовать свойства, которые вы хотите сохранить / загрузить.