Laden...

Deepcopy eines XElements

Erstellt von Larsen vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.676 Views
L
Larsen Themenstarter:in
192 Beiträge seit 2006
vor 8 Jahren
Deepcopy eines XElements

Hallo Experten,

ich verzweifle gerade an einer (hoffentlich) Kleinigkeit.
Ich habe eine Struktur, in der ich ein paar Enumerationen und strings speichere.
Es ist aber auch ein XElement mit in der Struktur und genau das macht mir Kopfschmerzen.

Hin und wieder brauche ich einen DeepClone von so einem Objekt und ich kriege das XElement nicht mit eingefangen. Hab schon alles mögliche ausprobiert und mittlerweile das Gefühl, dass ich vor lauter Bäumen den Wald nicht sehe.

Hatte auch gelesen , dass das hier eine DeepCopy macht.


XElement Org = new XElement("HALLO");
XElement Test=new XElement(Org);

Hat aber auch nicht funktioniert 😦

Das hier ist gerade mein momentaner verzweifelter Versuch, der nicht funktioniert.

Was mach ich denn falsch oder wie macht man's richtig?


public struct SenderReceiverType :  ICloneable
    {
        public object Clone()
        {
            SenderReceiverType MyClone = (SenderReceiverType)this.MemberwiseClone();
            string Test = this.MetaData.ToString();
            MyClone.MetaData= new XElement(XElement.Parse(Test));
            return MyClone;
        }


        public string Init;
        public XElement MetaData;
        public string Comment;
        public eIntExt IE;
        public string RNB;

    }

...............Es gibt 10 Arten von Menschen ...............
die einen kennen binäre Zahlen, die anderen nicht!!!

P
1.090 Beiträge seit 2011
vor 8 Jahren

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

L
Larsen Themenstarter:in
192 Beiträge seit 2006
vor 8 Jahren

Danke Palin,

ich hatte auch schon einen Versuch mit der Serialisierung gestartet, bin aber dann letztendlich daran gescheitert, dass das XElement nicht serialisierbar ist. Zumindest war das die Fehlermeldung.

Ich werd' mir den Link aber noch genauer ansehen, hab gerade nur mein Telefon zur Hand 😃

Gruß Lars

...............Es gibt 10 Arten von Menschen ...............
die einen kennen binäre Zahlen, die anderen nicht!!!

2.079 Beiträge seit 2012
vor 8 Jahren

Ich würde eine Erweiterungsmethod schreiben für XElement schreiben.
Eine vollständige Kopie muss ja nicht zwingend sein, nur das, was Du brauchst.
Außerdem kannst Du dir das Leben sehr vereinfachen, wenn Du das ganze rekursiv für die verschachtelten Elemente aufrufst.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

5.658 Beiträge seit 2006
vor 8 Jahren

Hi Palladin007,

eine Erweiterungsmethode braucht man dafür nicht, man kann XElemente über die XDocument.Save-Methode serialisieren. Die schönere Lösung wäre aber, anstatt mit XElement-Objekten besser mit einem geeigneten Datenmodell zu arbeiten. XElemente repräsentieren Elemente im XML-Markup und keine anwendungsspezifische Daten.

Christian

Weeks of programming can save you hours of planning

6.911 Beiträge seit 2009
vor 8 Jahren

Hallo Larsen,

Hat aber auch nicht funktioniert 😦

Wie hast du das festgestellt?

Folgender Code erstellt eine (tiefe) Kopie und funktioniert auch:


XElement xml1 = new XElement("root",
	new XElement("child1",
		new XElement("name", "Kind 1"),
		new XElement("age", 12)
	),
	new XElement("child2",
		new XElement("name", "Kind 2"),
		new XElement("age", 23)
	)
);

XElement xml2 = new XElement(xml1);
xml1.Name = "Wurzel";

Debug.Assert(xml1.Name != xml2.Name);

Beachte bei deinem Vorhaben aber auch Kopie ohne ICloneable [oder warum man Objekte nicht kopieren sollte; Transaktionen auf Objekten]. Oft bzw. meistens ist klonen nicht nötig.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

L
Larsen Themenstarter:in
192 Beiträge seit 2006
vor 8 Jahren

Hi gfoidl,

hast natürlich Recht, der Code funktioniert.
Ich habe das "nur" in der "Überwachung" getestet, da scheint es ein Problem mit der Zuordnung zu geben. Ändere ich den Namen des Root Knotens im Überwachungsfenster, ändert es sich beim Original mit 😦.
Schreibe ich per code den Namen um, funktioniert es 😃

Verstehe ich zwar noch nicht ganz, könnte aber ein Bug im Überwachungsfenster sein.

Den gleichen Effekt kann ich übrigens auch mit deinem Codebeispiel nachvollziehen.
Ändere ich im Ü-Fenster den Wert von xml1.Name auf "root1234", ändert sich der Wert bei xml2 mit.
Führe ich jetzt die Codezeile aus, die den Wert auf "Wurzel" setzt, ist der Wert in xml1 auch "Wurzel". xml2 hat nach wie vor "root1234".
Ändere ich jetzt nochmals über das Ü-Fenster den Wert von xml1 auf "Wurzel5678", bleibt aber xml2 auf "root1234" stehen.

Auf jeden Fall, vielen DANK für eure Antworten !!! Jetzt sollte alles so klappen, wie ich mir das gewünscht habe 😃

Gruß
Lars

...............Es gibt 10 Arten von Menschen ...............
die einen kennen binäre Zahlen, die anderen nicht!!!