![]() |
XMLSerialisierer gefunden !!!
ich wollte Euch diesen Fund nicht vorenthalten !
Ich habe einen XML Serializer auf Basis der RTTI gefunden für Delphi !! Das ist soooo schön :-) man kann einfach alle Properties einer Klasse, welche von TPersistent, und deren Properties als published deklariert sind, simpel speichern. Es kann danach auch die Klasse um neue Properties erweitert werden.. Da es auf XML basiert, kann man die alten Properties trotzdem noch laden! nix binär oder so ... hier eine Erklärung: ![]() Hier die Komponente: ![]() und hier die Anwendung:
Delphi-Quellcode:
unit ufrm_XMLSerialisierer;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, XMLSerializer; type TForm1 = class(TForm) xmls: TXMLSerializer; btnSave: TButton; btnLoad: TButton; procedure btnSaveClick(Sender: TObject); procedure btnLoadClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; TMyClass = class(TPersistent) private FString : string; FNewDouble: Double; published property IchWillEinfachMalWasSpeichern : String read FString write FString; property NochMehr : Double read FNewDouble write FNEwDouble; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btnSaveClick(Sender: TObject); var mc : TMyClass; begin mc := TMyClass.Create; mc.IchWillEinfachMalWasSpeichern := 'Hallo'; xmls.XMLSettings.WellFormated := true; xmls.SaveObject(mc, 'MyClass'); xmls.SaveToFile('c:\test.txt'); mc.free; end; //============================================================================== procedure TForm1.btnLoadClick(Sender: TObject); var mc : TMyClass; begin mc := TMyClass.Create; xmls.LoadFromFile('c:\test.txt'); xmls.LoadObject(mc, 'MyClass'); ShowMessage(mc.IchWillEinfachMalWasSpeichern); mc.free; end; end. |
Re: XMLSerialisierer gefunden !!!
Ich benutze folgende Unit:
![]() Da gibt es auch einen XML-Serializer. (Habe den Funktionsumfang aber nicht mit dem von DragonSoft verglichen) Gruß Jürgen |
Re: XMLSerialisierer gefunden !!!
Zitat:
da man bei DragonSoft gleich die Quelltexte hat, werde ich wohl aber bei dieser Unit bleiben. Eigentlich tut diese Unit, alles was man braucht :-) |
Re: XMLSerialisierer gefunden !!!
Hallo zusammen?
Funktioniert dieser auch bei TObject Typen? Speichert dieser auch private odr protected propertys? |
Re: XMLSerialisierer gefunden !!!
Nein, die Objekte müssen mindestens von TPersistent abgeleitet sein.
Es müssen ja die Informationen der RTTI vorhanden sein -- alles was dort festgehalten ist, wird auch bzw. kann auch gespeichert werden. Edit: bei Simdesign sind das alle published-Eigenschaften. Gruß Jürgen |
Re: XMLSerialisierer gefunden !!!
TPersistent muss nicht sein, man kann auch eigene Klasse ab TObject dazu bringen, wenn der Compilerschalter {$M+} vor dem Block der Properties und {$M-} dahinter angegeben wird. Dies schaltet die Generierung der RTTI für den Bereich ein. Mehr macht TPersistent grundlegend auch nicht. Aber private & protected - ich bin mir nicht sicher, aber diese sollten trotzdem nicht funktionieren - aber ab public sollte es klappen.
|
Re: XMLSerialisierer gefunden !!!
hmm .. {$M+} und {$M-} reicht wohl doch nicht.
Muss TPersistent und published sein ... |
Re: XMLSerialisierer gefunden !!!
Zitat:
Delphi-Quellcode:
Sobald man public in published ändert, kann die Property Bar gesetzt werden. {$TYPEINFO ON} {$METHODINFO ON} braucht man dazu auch nicht anzugeben. (Delphi 2009)
program ExRTTI;
{$APPTYPE CONSOLE} uses SysUtils, TypInfo, Classes; type {$M+} {$TYPEINFO ON} {$METHODINFO ON} TFoo = class(TObject) private FBar: string; public property Bar: string read FBar write FBar; end; var Foo: TFoo; PropInfo: PPropInfo; TypeKind: TTypeKind; begin Foo := TFoo.Create; Foo.Bar := 'boo'; { Get info record for Bar property } PropInfo := GetPropInfo(Foo, 'Bar'); { If property exists, set value to test } if Assigned(PropInfo) then begin SetStrProp(Foo, PropInfo, 'test'); end; WriteLn('Foo.Bar=' + Foo.Bar); ReadLn; end. |
Re: XMLSerialisierer gefunden !!!
ah ... nun gehts doch .. das ist ja gut.
Nun kann man auch TObject abspeichern, habs probiert. Allerdings muss man, wenn man kein Delphi 2009 hat Typinfo On unbedingt setzen, sonst gehts nicht ... {$M+} {$TYPEINFO ON} {$METHODINFO ON} |
Re: XMLSerialisierer gefunden !!!
die Komponente hat noch einen kleinen Schusselfehler ..
er hat ein schonmal eingefügtes Object (mit dem gleichen Wunschnamen) nicht mehr gefunden, und somit nicht überschrieben, wenn man etwas hinzufügt, nachdem man Load aufgerufen hat. <edit> .. siehe hier: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz