AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Seriallisieren/Deseriallisieren von Enums via RTTI
Thema durchsuchen
Ansicht
Themen-Optionen

Seriallisieren/Deseriallisieren von Enums via RTTI

Ein Thema von Ghostwalker · begonnen am 10. Mai 2017 · letzter Beitrag vom 10. Mai 2017
Antwort Antwort
Seite 1 von 2  1 2      
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#1

Seriallisieren/Deseriallisieren von Enums via RTTI

  Alt 10. Mai 2017, 12:22
Delphi-Version: 5
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:
  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;
Seriallisiert sieht so ein Objekt so aus:
Code:
   :
   tkInteger,"Integer","Wert",42
   :
Problem ist nun, wie ich das ganze mit Enums mache. Seriallisiert sieht das ganze derzeit so aus:

Code:
  :
  tkEnumeration,"TMyEnum01","MyEnum1","me1A"
  :
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 ?
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Seriallisieren/Deseriallisieren von Enums via RTTI

  Alt 10. Mai 2017, 13:58
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;
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Seriallisieren/Deseriallisieren von Enums via RTTI

  Alt 10. Mai 2017, 14:09
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.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#4

AW: Seriallisieren/Deseriallisieren von Enums via RTTI

  Alt 10. Mai 2017, 14:13
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 ?
Wenn du weißt, daß der Typ TMyEnum01 ist, dann sollte es einfach so gehen:

  value := TValue.From<TMyEnum01>(TRttiEnumerationType.GetValue<TMyEnum01>('me1A'));
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Seriallisieren/Deseriallisieren von Enums via RTTI

  Alt 10. Mai 2017, 14:23
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.
Da gibt es keine Unit namens REST.Json und REST.JsonReflect?
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Seriallisieren/Deseriallisieren von Enums via RTTI

  Alt 10. Mai 2017, 14:27
@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:
var
  tenumtypename : string;

begin
  value := TValue.From<tenumtypename>(TRttiEnumerationType.GetValue<tenumtypename>('me1A'));
end;
zeigt sich der Compiler leider von der störrischen Seite
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: Seriallisieren/Deseriallisieren von Enums via RTTI

  Alt 10. Mai 2017, 14:48
Wie wäre es, wenn du Enums einfach genauso wie andere Ordinal-Typen behandelst? Sprich: Die Werte als Zahl abspeichern/auslesen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Seriallisieren/Deseriallisieren von Enums via RTTI

  Alt 10. Mai 2017, 16:05
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..).
Uwe
e=mc² or energy = milk * coffee²

Geändert von Ghostwalker (10. Mai 2017 um 16:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#9

AW: Seriallisieren/Deseriallisieren von Enums via RTTI

  Alt 10. Mai 2017, 17:04
Würde nix daran ändern. Früher oder Später muss ich auf den entsprechenden Enum-Type (den ich aber nur als String hab).
Ich kenne bislang auch keine Möglichkeit von einem String auf einen Enum-Type zu kommen, außer man hat den Namen der Unit, in der er deklariert ist. Dann könnte das so gehen:
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#10

AW: Seriallisieren/Deseriallisieren von Enums via RTTI

  Alt 10. Mai 2017, 17:38
Ich muss nur anhand des Enum-Type die
Größe feststellen und das ganze entsprechend casten (Byte,word..).
Delphi-Referenz durchsuchenOrd
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz