Einzelnen Beitrag anzeigen

Dawn87

Registriert seit: 15. Feb 2007
Ort: Lüdenscheid
189 Beiträge
 
Delphi XE5 Professional
 
#1

Serialisierung von TCollection mit TXMLSerializer

  Alt 1. Jul 2009, 16:29
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
  Mit Zitat antworten Zitat