Kopieren von Objekten in Delphi

8

Ich habe ein komplexes Objekt, das tief kopiert werden kann (viele Arrays, Objekte, Zeiger, Ebenen von Vererbungsebenen, Hunderte von Mitgliedern verschiedener Typen und mehr) und es über die Zuweisungsmethode von Delphi neu zu erstellen ist nicht produktiv und am meisten wahrscheinlich zu komplex.

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() ) durchzugehen und alles anhand von Pointern basierend auf TTypeKind -Werten zuzuweisen. (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

Ссылка

Gibt es irgendetwas in Delphi, das der C # -binären Serialisierung nahekommt und eine tiefe Kopie unter Verwendung eines Speicherstroms erzeugt? 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?

    
Alex 30.04.2013, 20:10
quelle

2 Antworten

5

Mit ein paar Worten können Sie nicht verwenden, um das tiefe Kopieren zu vereinfachen (es wird komplizierter und fehleranfälliger sein als die klassische Zuweisung)

Sie müssen also näher auf TPersistent und seine untergeordneten Objekte schauen und die Methoden Zuweisen , AssignTo überschreiben (es gibt keinen einfacheren Weg)

    
VitaliyG 04.06.2013, 19:32
quelle
0

Alex Ich hatte das selbe Problem wie du, ich habe mir ein wenig den Kopf gebrochen und den folgenden Code geschrieben, der mein Problem beantwortet hat, hoffentlich auch deinen oder andere.

%Vor%     
Marcos Oliveira 27.11.2015 19:46
quelle

Tags und Links