ich benötige eine Anleitung wie ich einen Deep Clone eines Objekt-Baumes erzeugen kann. Mein first guess war, einfach die Objekte im Speicher zu serializieren und wieder zu deserialisieren. Das klappt bis auf eine wichtige Ausnahme:
A -> B -> C / | E | \ | D ------> ^
Wenn ich E serialisiere, ist mit meiner Methode natürlich nach dem Clonen Objekt C plötzlich zwei mal im Baum, einmal unter B, und einmal unter D, zwar mit gleichen Werten, aber eine andere Referenz, d. h. das ursprünglich serialisierte Objekt E nicht mehr äquivalent dem Original.
public class Person { public int Age; public string Name; public IdInfo IdInfo;
public Person ShallowCopy() { return (Person)this.MemberwiseClone(); } }
Die Funktion MemberwiseClone() kommt mit dem .NET Framework. Allerdings macht sie nur eine Flache Kopie. Sprich, sie kopiert nur die Referenzen auf die Objekte in den Feldern, nicht die Objekte selbst. Andernfalls müsstest du rekursiv vorgehen. In der Hilfe gibt es ein Beispiel dazu.
Naja, das dumme ist, dass es ja ein Deep Copy machen soll, allerdings im Sonderfall Objekt C sollen die beiden Referenzen im Ergebnis wieder auf dasselbe Objekt zeigen.
Ich habe zwar das Beispiel in der Hilfe nicht gefunden, jedoch den Hinweis auf Rekursion und der Notwendigkeit eine Liste der Objekte, die gecloned wurden zu führen. Daher hier ein accept.
Ich würde zusätzlich noch auf einen Vergleich verschiedener Methoden aus der dotnetpro (7/2010) verweisen, der genau auf dieses Problem zu sprechen kommt.
Mmmh. Also wenn ich es richtig verstanden habe, hast Du das mit der Serialisierung bereits zum größten Teil gelöst und nur bei E kommt es zu diesem Effekt? Also ich würde dann mal mit dem Debugger rangehen und versuchen rauszufinden an welcher Stelle es "kracht". Ansonsten: Konstantin hat ja bereits ein paar Links aufgeführt
Vielen Dank erstmal an alle. Ich weiß nicht, ob mein Problem richtig rübergekommen ist. Deep copy von Objekt-Trees klappt ja bereits. Nur in meinem Beispiel muss ich die Referenzen auf C nachträglich korrigieren.