Einzelnen Beitrag anzeigen

Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Serialisierung von TCollection mit TXMLSerializer

  Alt 3. Jul 2009, 10:47
Ich habe die Klasse mir jetzt so umgeschrieben, damit dort ohne Probleme TCollectionItem's gespeichert und geladen werden können. Außerdem benutze ich nicht den MSXML Parser sondern den aus dem alcinoe Projekt.

Dawn87, wenn ich richtig gelesen habe, benutzt du den XMLSerializer von DragonSoft, diesen habe ich modifiziert.
Dadruch spart man sich auf das Event zu reagieren.
In der Funktion LoadSingleClass:
Delphi-Quellcode:
  //[...]
if fSpecialClasses<>[] then
  begin
    if (scTCollection in fSpecialClasses) and aPropertyInstance.InheritsFrom(TCollection) then
    begin
      lPropNodes := aNode.ChildNodes.FindNode('customdata');
      { --------------------------- }
      for I := 0 to lPropNodes.ChildNodes.Count - 1 do
        if (lPropNodes.ChildNodes.Nodes[I].NodeName = 'class') then
          TCollection(aPropertyInstance).Add;
      { --------------------------- }
      if Assigned(lPropNodes) then
      begin
        for i := 0 to TCollection(aPropertyInstance).Count -1 do
          LoadClass(lPropNodes, TCollection(aPropertyInstance).Items[i], 'Item_' + IntToStr(i));
      end;
    end
    //[...]
Delphi-Quellcode:
procedure TSettingsManager.LoadSettings;
var XMLSerializer:TXMLSerializer;

  procedure LoadObjectEx(const aInstance: TObject);
  begin
    XMLSerializer.LoadObject(aInstance,aInstance.ClassName);
  end;

begin
  if FileExists(GetSettingsFolder + SettingsFilename) then
  begin
    XMLSerializer := TXMLSerializer.Create(nil);
    try
      with XMLSerializer do
      begin
        XMLSettings.WellFormated := true;
        SpecialClasses := [scTCollection];

        LoadFromFile(GetSettingsFolder + SettingsFilename);
        LoadObjectEx(SettingsManager.Settings); // zu ladende Klasse
      end;
    finally
      XMLSerializer.Free;
    end;
  end
  else LoadDefaultSettings;
end;
Delphi-Quellcode:
procedure TSettingsManager.SaveSettings;
var XMLSerializer:TXMLSerializer;

  procedure SaveObjectEx(const aInstance: TObject);
  begin
    XMLSerializer.SaveObject(aInstance,aInstance.ClassName);
  end;

begin
  XMLSerializer := TXMLSerializer.Create(nil);
  try
    with XMLSerializer do
    begin
      XMLSettings.WellFormated := true;
      StorageOptions := [soIncludeObjectLinks, soSortProperties];
      SpecialClasses := [scTCollection];
      SaveObjectEx(SettingsManager.Settings); // zu speichernde Klasse
      SaveToFile(GetSettingsFolder + SettingsFilename);
    end;
  finally
    XMLSerializer.Free;
  end;
end;
Angehängte Dateien
Dateityp: pas uxmlserializer_420.pas (51,4 KB, 21x aufgerufen)
Sebastian
  Mit Zitat antworten Zitat