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