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)?