Ich habe ein komplexes Objekt zutiefst zu kopieren (viele Arrays, Objekte, Zeiger, Schichten von Vererbungsebenen, Hunderte von Mitgliedern verschiedener Typen und mehr), und neu erstellen es durch Delphi Assign-Methode ist nicht produktiv und wahrscheinlich zu komplex.Kopieren von Objekten in Delphi
Ich habe mir Rtti
angesehen und es scheint eine gute Option zu sein, aber bisher konnte ich nicht alle möglichen Szenarien abdecken. Ich möchte nicht so viel Zeit verschwenden und hoffen, ein gutes und einfaches Beispiel zu finden. Leider konnte ich noch keinen finden. Was ich bisher gemacht habe, ist, alle TRttiField
im Objekt mit einer Schleife (TRttiType.GetFields()
) durchlaufen und versuchen, alles mit Zeigern basierend auf TTypeKind
Werte zuweisen. (tkPointer, tkClass, tkClassRef ...)
Ich habe ein JSON/Marshalling-Beispiel gefunden, aber es konnte mein komplexes Objekt nicht tief kopieren; Ich habe Fehler;
Intern: Typ tkPointer wird derzeit nicht unterstützt
http://www.yanniel.info/2012/02/deep-copy-clone-object-delphi.html
Gibt es etwas in Delphi der Nähe von C# binäre Serialisierung und eine tiefe Kopie Erstellen eines Speicher-Stream verwendet wird. Oder gibt es ein gutes und einfaches Beispiel, das Sie in Delphi kennen, wenn Sie tiefe Kopien mit RTTI oder JSON/Marshalling machen, die mit den komplexesten Objekten funktionieren würden?
Jerry, diese Klasse erbt bereits TPersistent und der Assign wird überschrieben. Ich müsste manuell Hunderte von Objekten zuweisen, es sei denn, es gibt eine automatische Möglichkeit, dies zu tun. (Ich habe versucht, vererbte Assign aufzurufen, und es wurde ein Fehler wie "Kann MyObject nicht zu MyObject zuweisen" ausgelöst. Dies passierte, obwohl ich vor dem Aufruf von Assign nach dem korrekten Objekttyp suchte.) – Alex
Hunderte von Mitgliedern? Klingt so, als müsste man diesen bösen Jungen etwas abmildern. Für was es wert ist, gibt es Hunderte von Persistenzfragen hier auf SO. Viele Antworten schon da draußen. –
Nein, 'Assign' funktioniert nicht so. ** Sie ** sollten 'AssignTo' überschreiben und einen Mittelwert für das Kopieren angeben – OnTheFly