Feedback

C# - Deep Copy of object

Veröffentlicht von am 10/7/2008
(3 Bewertungen)
Klassen sind Verweistypen (= Referenztypen).

Wird zB
MyClass mc1 = new MyClass();
MyClass mc2 = mc1;
geschrieben verweise beide Variablen (mc1 und mc2) auf das selbe Objekt.

Wird eine exakte Kopie eines Objekts benötigt müsste also eine neues Objekt erstellt werden und dann alle Eigenschaften vom Original zur Kopier übertragen werden.
Dies kann aufwändig sein.
Mit Reflektion lässt sich dies ein wenig automatisieren aber mit dem Prinzip aus nachfolgendem Beispiel gehts am einfachsten. Hier wird das Original serialisiert und die Kopie aus dem serialisiertem Stream deserialisiert -> es existieren 2 unabhängige Objekte die zu diesem Zeitpunkt idente Eigenschaften aufweisen.

Hinweis: Die Klasse muss mit [Serializable()] markiert werden. Ist dies nicht möglich (zB weil Fremdkomponente) kann der binäre Serialisierung durch XML-Serialisierung ersetzt werden.
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace ConsoleApplication1
{
	class Program
	{
		static void Main(string[] args)
		{
			MyClass mcOriginal = new MyClass { Name = "Original" };
			MyClass mcDeepCopy = null;

			// Deep copy des Objekts. So wird kein Zeiger auf das
			// alte Objekt gespeichert -> sondern eine neue
			// unabhängige Instanz erzeugt:
			using (MemoryStream ms = new MemoryStream())
			{
				BinaryFormatter fmt = new BinaryFormatter();

				// Original serialisieren:
				fmt.Serialize(ms, mcOriginal);

				// Position des Streams auf den Anfang zurücksetzen:
				ms.Position = 0;

				// Kopie erstellen:
				mcDeepCopy = fmt.Deserialize(ms) as MyClass;
			}

			mcDeepCopy.Name = "Kopie";

			// Ausgabe:
			Console.WriteLine("mc1: " + mcOriginal.Name);
			Console.WriteLine("mc2: " + mcDeepCopy.Name);
			Console.ReadKey();
		}
	}

	[Serializable()]
	public class MyClass
	{
		public string Name { get; set; }
	}
}
Abgelegt unter Kopieren, Deep Copy, Objkete.

1 Kommentare zum Snippet

Wolf schrieb am 2/4/2010:
Hi,

wie würde das ganze für einen "TreeView" aussehen???

Habe den Quellcode übernommen und auch angepasst doch leider funktioniert das noch nicht! :( Oder gibt es für den "TreeView" eine andere Möglichkeit??

THX
 

Logge dich ein, um hier zu kommentieren!