Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Deserialization: XmlNode to object
syn87
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

Deserialization: XmlNode to object

beantworten | zitieren | melden

Hallo und Tag,

ich bin zur Zeit etwas im Bereich "Verteilte Anwendungen" tätig.

Plugins können ein Objekt zur Speicherung anmelden:


SettingsRegister(object o);
Das Objekt wird dann automatisch beim Beenden der Anwendung zusammen mit allen anderen Settings in einer datei gespeichert.
Soweit klappt das auch alles ganz gut und er legt die XML-Datei korrekt an.
Ein Problem besteht momentan noch in der Deserialisierung der Objekte. Nach Start der Anwendung melden sich die Plugins zeitversetzt an. D.h. insbesondere, dass ich die Typdefinitionen nicht sofort zur Verfügung habe. Resultat dessen ist, dass alle Objekte, die mit SettingsRegister angemeldet wurden, nun zunächst als XMLNode[] vorliegen. Nun kommt die Frage: Kann man einen XMLNode nachträglich deserialisieren?

Meine momentane Lösung besteht darin, die XML-Datei erneut einzulesen, wenn das Plugin nach seinem Objekt fragt:


SettingsFetch(Type t);
Denn dann habe ich die Typdefinition und kann das Objekt finden. Nicht schön, aber selten.

Wäre schön wenn jemand eine Idee hätte.

Gruß,

Matze
private Nachricht | Beiträge des Benutzers
jaensen
myCSharp.de - Experte

Avatar #avatar-2657.png


Dabei seit:
Beiträge: 2.760
Herkunft: München

beantworten | zitieren | melden

Nun da stellt sich als erstes die Frage wie (de)serialisierst du?
Ich habe es mal so glöst das jedes Plugin einen eindeutigen Bezeichner hat und anhand dessen eine Art ConfigSection im Config-File erstellt wird über die nur die Host-Anwendung und das entsprechende Plugin verfügen kann. Das Plugin muss sich dann selbst darüm kümmern das die Einstellungen geladen und gespeichert werden (Hat in der SDK natürlich einige Tools dafür zur Verfügung).
private Nachricht | Beiträge des Benutzers
syn87
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

beantworten | zitieren | melden


class SettingsCollection
{
        [XmlElement("Settings")]
        public List<object> objs = new List<object>();

        [XmlIgnore]
        protected List<Type> types = new List<Type>();

        public void Save()
        {
            XmlSerializer serializer = new XmlSerializer(this.GetType(), types.ToArray());
            FileStream fs = new FileStream("configs\\settings.xml", FileMode.Create);
            serializer.Serialize(fs, this);
        }

        public bool Register(object o)
        {
            Type t = o.GetType();
            if (types.Contains(t))
                return false;

            objs.Add(o);
            types.Add(t);
            return true;
        }
}

Der Output sieht dann z.b. so aus:


<?xml version="1.0"?>
<SettingsCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Settings xsi:type="MainFormSettings">
    <Kuuuh>kuscheln</Kuuuh>
  </Settings>
</SettingsCollection>

Gruß,

Matze
private Nachricht | Beiträge des Benutzers
esskar
myCSharp.de - Member

Avatar #avatar-2885.jpg


Dabei seit:
Beiträge: 203
Herkunft: Dubai

beantworten | zitieren | melden

was passier denn, wenn du jetzt einfach folgendes machst


public static SettingsCollection Load()
{
   SettingsCollection  retval = null;
   try
   {
      XmlSerializer serializer = new XmlSerializer(typeof(SettingsCollection));
      using(FileStream fs = new FileStream("configs\\settings.xml", FileMode.Open))
          retval = (SettingsCollection)serializer.Deserialize(fs);
      foreach (object o in retval.objs)
         retval.types.add(o.GetType());
  }
  catch {
  }
  return retval;
}
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von esskar am .
private Nachricht | Beiträge des Benutzers
syn87
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

beantworten | zitieren | melden

Wenn ich beim deserialisieren den Typ der Objekte nicht kenne, werden daraus XMLNode[] Objekte.
private Nachricht | Beiträge des Benutzers
esskar
myCSharp.de - Member

Avatar #avatar-2885.jpg


Dabei seit:
Beiträge: 203
Herkunft: Dubai

beantworten | zitieren | melden

hmm schade, ich hatte gehofft, dass die xsi:type="MainFormSettings" genutzt würde.
private Nachricht | Beiträge des Benutzers
syn87
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

beantworten | zitieren | melden

Nein, wie auch. Zur Typdefinition bedarf es sicherlich etwas mehr als dem Namen. Trotzdem danke. Vielleicht hat noch wer ne idee.
private Nachricht | Beiträge des Benutzers