Abgetrennt von Zugriff auf Form durch String
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.
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!"
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 |
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.
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!"
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 |
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.
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;
}