XML Deserilizeren naar object in c#

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
Hoi Tweakers!

Ik ondervind wat moeilijkheden bij het deserializeren van een xml file naar objecten in c#.

Mijn object klasse ziet er als volgt uit:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;

namespace streamingServer
{

    public class AP
    {
        public string mac;
        public IPAddress ip;
        
        public AP()
        {
            //this.mac = mac;
            //this.ip = ip;
        }

        public string getMac()
        {
            return mac;
        }

        public void setMac(string mac)
        {
            this.mac = mac; 
        }

        public IPAddress getIp()
        {
            return ip;
        }

        public void setIp(IPAddress ip)
        {
            this.ip = ip;
        }
    }
}


en de xml file:
XML:
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfAP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <AP>
      <IP>192.168.5.130</IP>
      <MAC>000FCBB31536</MAC>
  </AP>
  <AP>
      <IP>192.168.5.140</IP>
      <MAC>000C42C9712A</MAC>
  </AP>
</ArrayOfAP>


En deze probeer ik als volgt te deserializeren:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
        private static List<AP> LoadAPS(string fileName)
        {

            string configPath = Directory.GetCurrentDirectory() + "\\";

            if (File.Exists(configPath + fileName))
            {
                XmlSerializer s = new XmlSerializer(typeof(List<AP>));
                TextReader r = new StreamReader(configPath + fileName);
                aps = (List<AP>)s.Deserialize(r);
                r.Close();
            }
            return aps;


Dit geeft echter de volgende fout:
There was an error reflecting type 'System.Collections.Generic.List`1[streamingServer.AP]'.

Ik heb begrepen dat je een paramterloze klasse moet hebben, dus daar heb ik voor gezorgd.
Er is nog een andere xml file met een array van strings die ik met bovenstaande methode probleemloos kan deserializeren. Heeft er iemand een idee waar het probleem zit?
Alvast bedankt!

grtz

Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Mijn eerste gok zou zijn dat de string "192.168.5.130" uit je xml file niet zomaar omgezet kan worden naar een IPAddress object. Als je het 'ip' ook als string zou meegeven, wat doet die dan?

Is IPAddress een standaard .NET class, of is dat een eigen class? Zit die misschien in System.Net?

Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
IPAdress zit idd in System.net

Ik heb er even een string van gmaakt en dat lijkt me al iets verder te brengen.
Nu verkrijg in echter een lijst van AP's waarvan de properties allemaal null zijn.

Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Maak eens kleine letters van die tags IP en MAC in de xml file.

[ Voor 14% gewijzigd door kluyze op 19-05-2012 16:59 ]


Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
BINGO! Dat ik daar weer overheen gekeken heb ..
bedankt @kluyze

Nog een bijkomend vraagje dan:
Ik krijg ook op deze lijn een exception:
C#:
1
XmlSerializer s = new XmlSerializer(typeof(List<AP>));


Exception:
BindingFailure was detected:
The assembly with display name 'mscorlib.XmlSerializers' failed to load in the 'LoadFrom' binding context of the AppDomain with ID 1. The cause of the failure was: System.IO.FileNotFoundException: Could not load file or assembly 'mscorlib.XmlSerializers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.

ik kan echter wel gewoon continuen en alles verloopt daarna zoals verwacht, het zou natuurlijk netter zijn moest ik van deze exception af geraken ..

Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Trouwens als je toch graag met hoofdletters werkt, of je objecten hebben andere benamingen voor de properties als de tags in de xml file.

MSDN: Controlling XML Serialization Using Attributes

Je andere foutmelding, kan ik niet zo onmiddellijk zeggen wat daar mis gaat. Hij zegt dat hij de file niet vindt. Misschien een rechten probleem?

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 23:21
Je zou ook eventueel met xsd.exe je class genereren.

Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
Aha, bedankt voor alle info. Zeker interessant.
Die error blijft me echter irriteren. Ik heb een aantal posts gevonden op fora van mensen die beweren dat dit normaal is. Lijkt me vreemd?
Ik heb het voorlopig opgelost door te zorgen dat die niet meer stopt op bindingFailure exceptions.
Het zou echter mooi zijn moest ik dit nog kunnen oplossen.

Acties:
  • 0 Henk 'm!

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 06-09 20:35

Wijnbo

Electronica werkt op rook.

Compleet off-topic, maar vanwaar de losse getters, setters EN public fields?

public int blaat {get; set;} is genoeg toch?

Acties:
  • 0 Henk 'm!

  • FlowinG
  • Registratie: Maart 2003
  • Laatst online: 19:04
Wat die binding failure betreft: probeer eens clean solution te doen en dan opnieuw te bouwen? Check verder even wat je buildsettings zijn: client profile/anders? Probeer anders geen list terug te geven maar een echte array: AP[].

Als dit allemaal niet werkt: kan je dan wat meer info geven over hoe je solution in elkaar zit? Bijvoorbeeld of je meerdere projecten hebt, .NET target versies, etc...

Edit: ik bedenk me net: waarschijnlijk is het IPAddress het probleem: als je het veld IP eens een string maakt, geeft hij dan nog steeds die foutmelding?

[ Voor 16% gewijzigd door FlowinG op 24-05-2012 21:32 ]


Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
Wijnbo schreef op maandag 21 mei 2012 @ 09:55:
Compleet off-topic, maar vanwaar de losse getters, setters EN public fields?

public int blaat {get; set;} is genoeg toch?
Uiteraard ja, zo slim ben ik ook wel :9
Moest er nog uitgezwierd worden. Was work in progress code toen ik me er nog niet van bewust was dat de properties public moesten zijn ..

[ Voor 9% gewijzigd door Lunacy op 27-05-2012 00:08 ]


Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
FlowinG schreef op donderdag 24 mei 2012 @ 21:31:
Wat die binding failure betreft: probeer eens clean solution te doen en dan opnieuw te bouwen? Check verder even wat je buildsettings zijn: client profile/anders? Probeer anders geen list terug te geven maar een echte array: AP[].

Als dit allemaal niet werkt: kan je dan wat meer info geven over hoe je solution in elkaar zit? Bijvoorbeeld of je meerdere projecten hebt, .NET target versies, etc...

Edit: ik bedenk me net: waarschijnlijk is het IPAddress het probleem: als je het veld IP eens een string maakt, geeft hij dan nog steeds die foutmelding?
Was het probleem ff uit het oog verloren nu die de exception negeert :F
Ik probeer het iig allemaal even uit en laat je nog weten wat het resultaat is
Clean solution had ik al wel gedaan.

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 23:21
Lunacy schreef op zondag 27 mei 2012 @ 00:03:
[...]
Uiteraard ja, zo slim ben ik ook wel :9
Moest er nog uitgezwierd worden. Was work in progress code toen ik me er nog niet van bewust was dat de properties public moesten zijn ..
Wat heeft het wel of niet public zijn van een property te maken met de
C#:
1
public int blaat {get; set;}
te maken?

Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
Caelorum schreef op zondag 27 mei 2012 @ 01:19:
[...]

Wat heeft het wel of niet public zijn van een property te maken met de
C#:
1
public int blaat {get; set;}
te maken?
Niks?

Acties:
  • 0 Henk 'm!

  • PeaceNlove
  • Registratie: Juni 2004
  • Laatst online: 22:08

PeaceNlove

Deugleuter

Waarom maak je niet eerst wat code om een voorbeeldobject te serializeren naar de XML? Dan weet je wat .Net verwacht van je XML bestand en kan je door te vergelijken zien waar het mis gaat?

Acties:
  • 0 Henk 'm!

Verwijderd

Exception:
BindingFailure was detected:
The assembly with display name 'mscorlib.XmlSerializers' failed to load in the 'LoadFrom' binding context of the AppDomain with ID 1. The cause of the failure was: System.IO.FileNotFoundException: Could not load file or assembly 'mscorlib.XmlSerializers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.

ik kan echter wel gewoon continuen en alles verloopt daarna zoals verwacht, het zou natuurlijk netter zijn moest ik van deze exception af geraken ..
Volgens mij heb je onder Tools-Options-Debugging-General de optie Just My Code 'Uit' staan. Deze moet aan. Dan krijg je alleen nog maar exceptions van code die daadwerkelijk van jou is.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 22:43
Lunacy schreef op zaterdag 19 mei 2012 @ 17:04:
BINGO! Dat ik daar weer overheen gekeken heb ..
bedankt @kluyze

Nog een bijkomend vraagje dan:
Ik krijg ook op deze lijn een exception:
C#:
1
XmlSerializer s = new XmlSerializer(typeof(List<AP>));


Exception:
BindingFailure was detected:
Dat komt doordat de classes die worden gebruikt om je object te serializen/deserializen on the fly worden gegenereerd; ze treden ook alleen bij de eerste keer dat een type wordt gerbuikt op.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1