| 

.NET C# Java Javascript Exception

3
Hallo,

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.

Hat jemand einen Tipp für mich?

danke vorab
maria
07.02.2011
Maria Simlinger 1,1k 1 9
5 Antworten
1
Vielleicht hilft dir das weiter:
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.
07.02.2011
tboerner 509 8
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.
Maria Simlinger 07.02.2011
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.
Maria Simlinger 08.02.2011
2
Hier findest du verschiedene Varianten, Tilman hat ja bereits MemberwiseClone angesprochen.

Deep Clone mit Reflektion:
http://www.codeproject.com/KB/cs/cloneimpl_class.aspx

Deep Clone mit Serialisation:
http://www.codeproject.com/KB/tips/SerializedObjectCloner.aspx

Deep Clone mit IL:
http://whizzodev.blogspot.com/2008/03/object-cloning-using-il-in-c.html

Deep Clone mit erweiterten Methoden:
http://ox.no/posts/extension-methods-for-copying-or-cloning-objects

Viel Erfolg :-)
07.02.2011
Konstantin 3,7k 1 8
Vielen dank, aber ich fürchte alle diese Methoden führen zum selben Ergebnis wie meine. (IL ist nicht meins, also hab' ichs ignoriert).
Maria Simlinger 07.02.2011
1
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.
07.02.2011
Andy Stumpp 509 1 6
0
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
07.02.2011
Joachim 3,1k 4 9
0
Guten Morgen,

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.

Ich habe jetzt durch Zufall einen schon etwas älteren Ansatz gefunden: Deep cloning a connected graph of objects (switchonthecode)? Muss aber erst prüfen wie sich diese Methode bei großen Objektstrukturen verhält.
08.02.2011
Maria Simlinger 1,1k 1 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH