AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Generischer Serialisierer

Ein Thema von EConvertError · begonnen am 12. Feb 2006 · letzter Beitrag vom 26. Feb 2006
 
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#6

Re: Generischer Serialisierer

  Alt 18. Feb 2006, 13:15
Zitat von EConvertError:
Danke für die Antwort!

Ich kenne die Serialisierung von .NET (bin auch C#-Programmierer). Deshalb ist die Ähnlichkeit der Quellcodes kein Zufall!
Warum tust du dir dann die RTTI überhaupt noch an ? Gut, einen Versuch ist es wert, aber IMHO lohnt sich der Aufwand nicht, in der Zeit spiele ich lieber mit Reflection rum .
Zitat:
Genau das Erstellen eines Objektes basierend am Klassennamen habe ich noch nicht geschafft. Mein Ansatz:
Delphi-Quellcode:
var
  Obj : TObject;
  ClassName: String;
begin
  ...
  Obj := GetClass(ClassName).Create;
  if Obj is TButton then
    // Hier tritt dann eine Access-Violation auf:
    TButton(obj).Parent := self; //self = TForm
Du musst den richtigen Konstruktor aufrufen:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  ClassType: TClass;
  Instance: TControl;
begin
  RegisterClass(TButton);

  ClassType := GetClass('TButton');
  if ClassType = nil then
    ShowMessage('Klasse nicht gefunden')
  else
    if ClassType.InheritsFrom(TControl) then
    begin
      Instance := TControlClass(ClassType).Create(Self);
      if Instance = nil then
        ShowMessage('Instanz nicht erstellt')
      else
        Instance.Parent := Self;
    end
    else
      ShowMessage('Klasse kein Control');
end;
Zitat:
Interessant wäre hierbei auch noch, ob ich da ganz etwas anderes vorhabe, wie Maximov es vorgeschlagen hat, also ob ich seine Idee komplett missverstanden habe.
Ich bin zwar nicht Maximov, aber ich denke nicht, dass du ihn falsch verstanden hast. Eben soetwas, wie man es aus der FCL kennt.

Zitat:
Diese Lösung (TObjectList mit polimorphen Objecten zum Speichern) gefällt mir nicht, weil ich die zu speichernden Eigenschaften als published deklarieren muss. Ich möchte aber auch private-Felder speichern.
Das war nicht zur Anregung gedacht (sonst könntest du ja einfach TReader nehmen), ich fand nur den Schreibfehler lustig .
Zitat von EConvertError:
Allerdings verlangt die Schnittstelle in .net auch einen Konstruktor mit den gleichen Argumenten, um das Objekt wieder deserialisieren zu können. Hier wird die ganze Geschichte für mich problematisch, da ich ja nicht schreiben kann:
Delphi-Quellcode:
type
  ITestInterface = Interface(IInterface)
    constructor Create({My arguments});
  end;
Ohne Reflection gibt es wohl nur einen Weg: Eine Basisklasse statt einem Interface:
Delphi-Quellcode:
TSerializable = class
public
  constructor Create (info: TSerializationInfo, ...); abstract;
Zitat:
Das zweite größere Problem ist: Wie erzeuge ich ein Objekt vom benötigten Typ, wenn ich nur die Eigenschaft ClassType oder ClassName des Objekts gegeben habe? Geht das überhaupt? Ich bräuchte das zum deserialisieren...
Hast du den passenden Code nicht schon oben geschrieben (und ich verbessert)?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
 


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 10:25 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 by Thomas Breitkreuz