dotnet-snippets.de
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1314 | Anzahl registrierter User: 1266 | Besucher online: 332
Hauptmenü
Home
Snippet Wettbewerb
Top Ten
Zufälliger Snippet
Vista Gadget
T-Shirts für Geeks
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social
Facebook
Twitter
RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss Delphi.NET
Rss ASP.NET
Werbung
Alice DSL Flatrate

Partner
Partner von Codezone.de


Member of Microsoft Community Leader/Insider Program (CLIP)

Deep Copy of object


Autor: Günther Foidl
Sprache: C#
Bewertung:
noch nicht bewertet

Anzahl der Aufrufe: 4785
  

Beschreibung:

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.


Abgelegt unter: Kopieren, Deep Copy, Objkete.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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; }
	}
}
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Wolf schrieb am:  04.02.2010 16:35:51

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


schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.