![]() |
Delphi-Version: 5
Seriallisieren/Deseriallisieren von Enums via RTTI
MoinMoin,
ich bin gerade drüber, mir eine (möglichst Allgemeingültige und flexible) Lösung zu bauen, um Optionen/Einstellungen eines Programmes zu speichern (ich weiß...gibts in 20002 mögliche Varianten :) ) Plan: Die App definiert sich eine Klasse (oder einen Record) für die ganzen Optionen/Einstellungen. Ein Objekt nimmt die Klasse/Record und seriallisiert/deseriallisiert das ganze in eine Datei (Format steht derzeit nicht fest). Dazu wird, via RTTI, für jede Property der Options-Klasse ein, ich nenn es mal Field-Objekt erzeugt, das die Informationen wie Typ, Value usw. enthält.
Delphi-Quellcode:
Seriallisiert sieht so ein Objekt so aus:
TAbsField = class(TPersistent)
private fname : Unicodestring; fvalue: TValue; fseperator : UnicodeString; ftype : Unicodestring; protected function GetType:TTypeKind; public constructor Create(Seperator:Unicodestring=';'); procedure Assign(source:TPersistent); function SerializeToString:UnicodeString;virtual; procedure DeserializeFromString(aString:UnicodeString);virtual; published property Kind : TTypekind read GetType; property Name : UnicodeString read fname write fname; property Value : TValue read fvalue write fvalue; property Typename: Unicodestring read ftype write ftype; Property Seperator : UnicodeString read fseperator write fseperator; end;
Code:
Problem ist nun, wie ich das ganze mit Enums mache. Seriallisiert sieht das ganze derzeit so aus:
:
tkInteger,"Integer","Wert",42 :
Code:
Bein Einlesen steh ich aber vor dem Problem, wie ich nun aus den Infos wieder ein TValue (oder TMyEnum01) mache, um das in der Field-List reinbekomme. Hat da jemand ne Idee ?
:
tkEnumeration,"TMyEnum01","MyEnum1","me1A" : |
AW: Seriallisieren/Deseriallisieren von Enums via RTTI
Nicht selber stricken!
Schau doch mal, wie weit du mit den schon eingebauten Mechanismen kommst.
Delphi-Quellcode:
uses REST.JSON, System.JSON; procedure TForm1.Button1Click(Sender: TObject); var Foo: TFoo; begin Foo := TFoo.Create; try Foo.Foo := 'Hello World'; Foo.Fee := 42; Memo1.Lines.Text := TJson.ObjectToJsonString(Foo); finally Foo.Free; end; Foo := TJson.JsonToObject<TFoo>(Memo1.Lines.Text); try Foo.Fee := 100; Memo1.Lines.Add(TJson.ObjectToJsonString(Foo)); finally Foo.Free; end; end; |
AW: Seriallisieren/Deseriallisieren von Enums via RTTI
Gugg mal auf die Version von Delphi von mir :)
Starter hat kein REST. Und mit System.Json muss ich den RTTI-Teil auch selber machen. |
AW: Seriallisieren/Deseriallisieren von Enums via RTTI
Zitat:
Delphi-Quellcode:
value := TValue.From<TMyEnum01>(TRttiEnumerationType.GetValue<TMyEnum01>('me1A'));
|
AW: Seriallisieren/Deseriallisieren von Enums via RTTI
Zitat:
|
AW: Seriallisieren/Deseriallisieren von Enums via RTTI
@TiGü
Nein, leider nicht (btw. auch kein DBExpress :) ) @Uwe Jo, dann müsst ich aber eine Case machen (für jeden Enum-Typ). Den Typ hab ich als String (weil ja aus Datei) vorliegen. und bei
Delphi-Quellcode:
zeigt sich der Compiler leider von der störrischen Seite :)
var
tenumtypename : string; begin value := TValue.From<tenumtypename>(TRttiEnumerationType.GetValue<tenumtypename>('me1A')); end; |
AW: Seriallisieren/Deseriallisieren von Enums via RTTI
Wie wäre es, wenn du Enums einfach genauso wie andere Ordinal-Typen behandelst? Sprich: Die Werte als Zahl abspeichern/auslesen.
|
AW: Seriallisieren/Deseriallisieren von Enums via RTTI
Würde nix daran ändern. Früher oder Später muss ich auf den entsprechenden Enum-Type (den ich aber nur als String hab).
Edit: Ok....es ändert sehr viel, wenn man das ganze mal richtig betrachtet :) Ich muss nur anhand des Enum-Type die Größe feststellen und das ganze entsprechend casten (Byte,word..). |
AW: Seriallisieren/Deseriallisieren von Enums via RTTI
Zitat:
Delphi-Quellcode:
var
context: TRttiContext; rtype: TRttiType; value: TValue; begin context := TRttiContext.Create; rtype := context.FindType('<unitname>.TMyEnum01'); value := TValue.FromOrdinal(rtype.Handle, GetEnumValue(rType.Handle, 'me1A')); end; |
AW: Seriallisieren/Deseriallisieren von Enums via RTTI
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:16 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