Einzelnen Beitrag anzeigen

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, 12: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