Hallo,
ich benutze den XMLSerializer von dragonsoft und hab nun leider damit ein Problem:
Ich habe von TCollection und TCollectionItem abgeleitete Klassen die ich serialisiere und als
XML-Datei speicher. Das klappt soweit auch ganz gut:
Die Klassen:
Delphi-Quellcode:
type
TStorageItem = class(TCollectionItem)
private
FText: String;
function GetM_sText: string;
procedure SetM_sText(Value: string);
published
property Text: String read GetM_sText write SetM_sText;
end;
type TStorage = class(TCollection)
private
function GetItem(Index: Integer): TStorageItem;
procedure SetItem(Index: Integer; const Value: TStorageItem);
public
function Add: TStorageItem;
function FindItemID(ID: Integer): TStorageItem;
function Insert(Index: Integer): TStorageItem;
property Items[Index: Integer]: TStorageItem read GetItem write SetItem;
end;
Die Routine zum Speichern:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
coTest: TStorage;
coStore: TStorageItem;
begin
coTest := TStorage.Create(TStorageItem);
coStore := coTest.Add;
coStore.Text := 'Test';
coStore := coTest.Add;
coStore.Text := 'Test2';
coStore := coTest.Add;
coStore.Text := 'Test3';
with TXMLSerializer.Create(self) do
begin
XMLSettings.WellFormated := true;
StorageOptions := [soIncludeObjectLinks, soSortProperties];
SpecialClasses := [scTCollection];
SaveObject(coTest, 'Test');
SaveToFile('C:\test.xml');
end;
end;
Nun probiere ich diese Collection wieder aus der
XML auszulesen also zu deserialisieren:
Delphi-Quellcode:
var
coTest: TStorage;
coStore: TStorageItem;
i: Integer;
begin
coTest := TStorage.Create(TStorageItem);
with TXMLSerializer.Create(self) do
begin
XMLSettings.WellFormated := true;
SpecialClasses := [scTCollection];
LoadFromFile('C:\test.xml');
LoadObject(coTest, 'Test');
end;
ListBox1.Clear;
for i := 0 to coTest.Count - 1 do
begin
ListBox1.AddItem(coTest.Items[i].Text, nil);
end;
Das ganze Funktioniert nicht (coTest.Count ist immer 0). Ich habe mir den Quellcode der Deserialisierungsroutinen mal angeschaut und diese versucht per SetPropValue() die Count-Eigenschaft von meiner TStorage-Klasse zu manipulieren. Da diese aber Read-only ist, klappt das nicht.
Hat jemand eine Idee wie ich das Problem lösen könnte?
Grüße