Tiefe Objektkopie (deep copy) in Delphi
Eine Objektkopie (Klon) ist eine genaue Kopie eines Objekts, also aller seiner Eigenschaften und Attributwerte. Eine tiefe Objektkopie kopiert jede dieser Attributwerte, während eine flache Objektkopie enthält lediglich Verweise auf die Ursprungswerte.
Wann benötigen wir ein deep copy?
Nehmen wir als Beispiel ein Datenobjekt, welches wir über eine JSON-Schnittstelle an eine API senden. Dabei müssen wir in Strings z.B. die Hochkomma „escapen“, d.h. z.B. eine Backslash voransetzen, da das JSON-Format es so verlangt. Aus ‚hallo „test“‚ wird dann ‚hallo \“test\“‚.
Wir können jetzt in unserem Objekt alle String-Eigenschaften durchgehen und escapen, doch was wenn wir dieses Objekt noch weiter in unserem Programm benötigen, mit den Originaltexten?
Eine Lösung dafür: wir erstellen eine tiefe Objektkopie, escapen dort die Strings und schicken diese Kopie an die Schnittstelle. Das Originalobjekt bleibt davon unberührt und kann weiterhin verwendet werden.
Deep copy in Delphi
Eine Möglichkeit, in Delphi ein deep copy zu erstellen, ist es die eingebauten JSON-Objekte zu verwenden, und das Objekt zuerst in einen JSON-Objekt umzuwandeln und dieses dann wieder zurück in ein Delphi-Objekt. Diese Vorgänge nennt man auch marshall (in JSON umwandeln) und unmarshall (Json zurück in ein Objekt wandeln).
Folgender Code erstellt eine deep copy in Delphi von einem beliebigem Objekt:
// in Delphi XE müssen diese beiden Units eingebunden werden
uses DBXJSON, DBXJSONReflect;
function DeepCopy(aValue: TObject): TObject;
var
MarshalObj: TJSONMarshal;
UnMarshalObj: TJSONUnMarshal;
JSONValue: TJSONValue;
begin
Result:= nil;
MarshalObj := TJSONMarshal.Create;
UnMarshalObj := TJSONUnMarshal.Create;
try
JSONValue := MarshalObj.Marshal(aValue);
try
if Assigned(JSONValue) then
Result:= UnMarshalObj.Unmarshal(JSONValue);
finally
JSONValue.Free;
end;
finally
MarshalObj.Free;
UnMarshalObj.Free;
end;
end;
Code-Sprache: PHP (php)
Schreibe einen Kommentar
Du musst angemeldet sein, um einen Kommentar abzugeben.