Forum: PC-Programmierung C# list<T> zu XML


von brümi (Gast)


Lesenswert?

Hallo
Ich möcht bei meinem C# Programm eine List mit Objekten aus meiner 
eignenen Klasse abspeichern & wieder einlesen. Das Abspeichern 
funktioniert, beim einlesen bekomme ich jedoch folgender Fehler:

   InvalidOperationExeption wurde nicht behandelt.
   Fehler im XML-Dokument (0,0).

Was läuft falsch? habe schon x Varianten ausprobiert,jedoch ohne 
Erfolg..

1
        public static void SerializeToXML <T>(List<T> dataList, string path)
2
        {           
3
            XmlSerializer ser = new XmlSerializer(typeof(List<USBStick>));
4
            FileStream str = new FileStream(path, FileMode.Create);
5
            ser.Serialize(str,dataList);
6
            str.Close();
7
        }
8
9
        public static List<T> DeserializeToList<T>(string path)
10
        {
11
           List<T> list = new List<T>();
12
           XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<T>));
13
           FileStream str = new FileStream(path, FileMode.Create);
14
           list = (List<T>)xmlSerializer.Deserialize(str);            //<<== ERROR!
15
           return list;
16
        }

Der durch die SerializeToXML Methode erzeugtes XML Code
1
<?xml version="1.0"?>
2
<ArrayOfUSBStick xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
3
  <USBStick>
4
    <name>USB1</name>
5
    <path>PfadSpeicherort1</path>
6
    <archivPath>PfadArchiv1</archivPath>
7
    <IDnumber>46</IDnumber>
8
    <syncMode>375</syncMode>
9
    <archivMode>5743</archivMode>
10
    <archivMax>347</archivMax>
11
    <date>2012-10-10T00:00:00</date>
12
  </USBStick>
13
  <USBStick>
14
    <name>USB2</name>
15
    <path>PfadSpeicherort2</path>
16
    <archivPath>PfadArchiv2</archivPath>
17
    <IDnumber>4</IDnumber>
18
    <syncMode>3</syncMode>
19
    <archivMode>543</archivMode>
20
    <archivMax>34</archivMax>
21
    <date>2011-10-10T00:00:00</date>
22
  </USBStick>
23
</ArrayOfUSBStick>

Vielen Dank!

von Karl H. (kbuchegg)


Lesenswert?

1
public static List<T> DeserializeToList<T>(string path)
2
{
3
     List<T> list = new List<T>();
4
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<T>));
5
     FileStream str = new FileStream(path, FileMode.Create);
6
                                           ***************

Create?
Bist du dir da ganz sicher?

von Markus V. (Gast)


Lesenswert?

Bist Du Dir sicher, dass die Zeile Korrekt ist?
1
XmlSerializer ser = new XmlSerializer(typeof(List<USBStick>));

Müsste das nicht XmlSerializer(typeof(List<T>)) heißen?

Gruß
Markus

von Markus V. (Gast)


Lesenswert?

Ach ja, wie sieht eigentlich der Code der Klasse USBStick aus?

von Sebastian L. (Gast)


Lesenswert?

Markus V. schrieb:
> Ach ja, wie sieht eigentlich der Code der Klasse USBStick aus?

das ist irrelevant den speichern kann ers auch

das file mode create ist schon mal falsch
und beim deserialize muss der serializer auch vom typ List<USBStick> 
sein

von Markus V. (Gast)


Lesenswert?

Sebastian L. schrieb:
> das ist irrelevant den speichern kann ers auch

Ich habe nicht behauptet, dass es für das gegeben Beispiel relevant ist. 
Ich habe lediglich darauf hingewiesen, dass es im allgemeinen 
(generischen) Fall falsch ist.

Gruß
Markus

von Sascha H. (Gast)


Lesenswert?

So sollte es gehen, wenn du es generisch machen willst:
1
        public static void SerializeToXML <T>(List<T> dataList, string path)
2
        {           
3
            XmlSerializer ser = new XmlSerializer(typeof(List<T>));
4
            using(FileStream str = new FileStream(path, FileMode.Create))
5
            {
6
              ser.Serialize(str,dataList);
7
            }
8
        }
9
10
        public static List<T> DeserializeToList<T>(string path)
11
        {
12
           XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<T>));
13
           List<T> list;
14
           using(FileStream str = new FileStream(path, FileMode.Open))
15
           {
16
               list = (List<T>)xmlSerializer.Deserialize(str);
17
           }
18
           return list;
19
        }


Aber - wenn schon generisch, warum dann auf List<T> festgenagelt, warum 
nicht einfach T?

Gruß,
Sascha

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.