Laden...

Liste serialisieren

Erstellt von reloop vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.274 Views
Hinweis von talla vor 13 Jahren

Abgetrennt von Zugriff auf Form durch String

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

Eine kurze Frage, das Thema betreffend, hätte ich noch:

Wie kann ich eine List durch eine XML Datei füllen und selbigen Weg zurück gehen?

Ich habe eine Klasse, welche als Eigenschaft eine List<> besitzt.

            XmlSerializer xs = new XmlSerializer(typeof(myClass));
            StreamWriter sw = new StreamWriter(thePath);
            xs.Serialize(sw, this);

Das war mein Versuch, der führte jedoch nicht zum gewünschten Ergebnis. Dabei ist zu dem Zeitpunkt this.myList<> mit den gewünschten Datein gefüllt.

Danke für eure Hilfe,

cs.

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

führte jedoch nicht zum gewünschten Ergebnis.

Inwiefern?

Siehe auch XmlArrayAttribute.

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!"

2.298 Beiträge seit 2010
vor 13 Jahren

Ich handhabe das so, dass ich Listen immer! direkt als Array serialisiere und auch wieder deserialisiere.

Beispiel:



private List<MyType> myList = new List<MyType>();

public void Serialize()
{
      XmlSerializer serializer = new XmlSerializer(typeof(MyType[]));
      Stream myStream = null;
      try
      {
              stream = File.Open("meinexmldatei.xml", FileMode.Create);
              serializer.Serialize(stream, myList.ToArray());
      }
      finally
      {
              if(stream != null)
                     stream.Close();
      }
}

public void Deserialize()
{
      XmlSerializer serializer = new XmlSerializer(typeof(MyType[]));
      Stream stream = null;
       try
      {
              if(File.Exists("meinexmldatei.xml"))
              {
                  stream = File.Open("meinexmldatei.xml", FileMode.Open);
                  MyType[] deserializedItems =  (MyType[])serializer.Deserialize(stream);
                 myList.Clear();
                 myList.AddRange(deserializedItems);             
              }
      }
      finally
      {
              if(stream != null)
                     stream.Close();
      }
}

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

Danke, inflames2k.

Deine Antwort war die Lösung meines Problems.

Gruss,
cs.

R
103 Beiträge seit 2009
vor 13 Jahren

Hmm verstehe ich nicht den Workaround mit dem Array.
man kann doch Listen serialisieren. einfach

typeof(List<MyType>) beim serialisieren

und als Rückgabe beim deserialisieren List<MyType> nehmen.

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

Hmm verstehe ich nicht den Workaround mit dem Array.

Ich auch nicht 😉 bzw. verstehen schon, aber es ist nicht notwendig.

Zumal mit den XmlArray- und XmlArrayItem-Attributen das auch angepasst werden kann.

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!"

2.298 Beiträge seit 2010
vor 13 Jahren

Hallo rasepretrep,

das gilt aber nicht für alle Framework Versionen. - Und dann lieber programmier ich eine Klasse so, dass ich sie nötigen Falls auch in niedrigern Versionen einsetzen kann als dort dann noch mal Hand anlegen zu müssen.

Das entstehende XML ist im nachhinein sowieso fast das selbe.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

R
103 Beiträge seit 2009
vor 13 Jahren

Hallo Inflames2k,

Klar geht natürlich auch deine Variante und kommt aufs gleiche raus, aber das Serialisieren als List<T> wird auch schon ab der Frameworkversion 2 unterstützt.

Die Rückwärtskompatibilität zu 1.0 oder 1.1 habe ich schon längst abgeschrieben, da gibts ja nicht mal Generics.

R
103 Beiträge seit 2009
vor 13 Jahren

Der Vollständigkeit halber hier mal meine Variante des Serializers:


public static void Serialize(Object obj,String strFileName) {

            if (!Directory.Exists(Path.GetDirectoryName(strFileName)))
                Directory.CreateDirectory(Path.GetDirectoryName(strFileName));

            XmlSerializer xs = new XmlSerializer(obj.GetType());

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            settings.Encoding = Encoding.UTF8;
            using (XmlWriter xmlWriter = XmlWriter.Create(strFileName, settings))
            {
                xs.Serialize(xmlWriter, obj);
            }
  }


public static T DeSerialize<T>(String strFileName)
{
            T retVal;

            using (FileStream fs = new FileStream(strFileName, FileMode.Open))
            {
                XmlReader reader = new XmlTextReader(fs);
                XmlSerializer xs = new XmlSerializer(typeof(T));
                retVal = (T)xs.Deserialize(reader);
            }
            return retVal;
 }