Deserializacja obiektów XML. Przy użyciu XmlArrayItem otrzymuję pustą tablicę

0

witam, mam problem z wykonaniem (może zrozumieniem) deserializacji grupy obiektów z pliku XML do tablicy(ewentualnie listy) obiektów.

Tak wygląda część XML, z obiektami typu TrackPoint (trkpt), które chcę umieścić w tablicy obiektów typu TrackPoint lub w liście.

            <trkseg>
                <trkpt lat="54.079258" lon="22.92989">
                    <speed>1.500000</speed>
                    <ele>193.3</ele>
                    <time>2014-06-11T07:04:58Z</time>
                </trkpt>
                <trkpt lat="54.079258" lon="22.929865">
                    <speed>1.500000</speed>
                    <ele>193.3</ele>
                    <time>2014-06-11T07:04:59Z</time>
                </trkpt>
           (...)
             </trkseg>

Klasy w moim kodzie:

        public class TrackSegment
        {
           [XmlArrayItem("trkpt", typeof(TrackPoint))]
           [XmlArray("trkseg")]
          //  [XmlElement("trkpt")] - z tym atrybutem działa!
            public TrackPoint[] TrackPt { get; set; }  
        }

        public class TrackPoint
        {
            [XmlElement("speed")]
            public float speed { get; set; }

            [XmlElement("ele")]
            public float elevation { get; set; }

            [XmlElement("time")]
            public DateTime time { get; set; }         
        }

Jeżeli zastosuję atrybut **XMLElement **to dane są przekazywane. Jeżeli zastosuję technikę z **XMLArrayItem **(wg mnie bardziej precyzyjną) to otrzymuję pustą tablicę.

Gdzie robię błąd ?

1

To mała podpowiedź na początek weź zamiast deserializacji xml'a weź utwórz taki przykładowy obiekt w kodzie i zrób serializacje. Porównasz xml'e i wszystko stanie się jasne. ;)

0

oki, dziękuję za naprowadzenie :) Nie wiem jak Ty to wypatrzyłeś DibbyDum ;) ...

Zdublowałem XMLElement "trkseg", po zapisaniu XML miałem takie cudo:

  <trk>
    <name>moja lista</name>
    <desc>desk desk</desc>
    <trkseg>
      <trkseg>
        <trkpt>
          <speed>1.12</speed>
          <ele>10.22</ele>
          <time>2015-02-02T09:48:23.8260263+01:00</time>
        </trkpt>
        <trkpt>
          <speed>1.12</speed>
          <ele>10.22</ele>
          <time>2015-02-02T09:48:23.8260263+01:00</time>
        </trkpt>
      </trkseg>
    </trkseg>
  </trk>

Wynika z tego, że są dwa elementy trkseg.

Przebudowałem klasę w następujący sposób:

  
public class TrackData
    {
        public TrackData() { }

        [XmlElement("name")]
        public string name { get; set; }
        
        [XmlElement("desc")]
        public string desc { get; set; }

//TUTAJ POPRAWILEM!
        //[XmlElement("trkseg")]
        //public TrackSegment TrackSegment { get; set; }  

        [XmlArrayItem("trkpt", typeof(TrackPoint))]
        [XmlArray("trkseg")]
        public List<TrackPoint> TrackPt { get; set; }
        
    }
//TA KLASA JEST JUŻ NIE POTRZEBNA!!!
 /*   
    public class TrackSegment
    {
        public TrackSegment() { }

       [XmlArrayItem("trkpt", typeof(TrackPoint))]
       //[XmlArray("trkseg")]
      ///  [XmlElement("trkpt")]
        //public TrackPoint[] TrackPt { get; set; }  
        public List<TrackPoint> TrackPt { get; set; }  
    }
*/
    public class TrackPoint
    {
        public TrackPoint() { }

        [XmlElement("speed")]
        public float speed { get; set; }

        [XmlElement("ele")]
        public float elevation { get; set; }

        [XmlElement("time")]
        public DateTime time { get; set; }
         
        public TrackPoint(float _speed, float _ele, DateTime _time)
        {
            speed = _speed;
            elevation = _ele;
            time = _time;
        }
    }

Dodałem też konstruktory domyślne, ale to na potrzeby zapisu do XML.
Wcześniej otrzymywałem error: Wystąpił błąd w czasie wykonywania odbicia typu

By the way.... Ile ja zmarnowałem czasu na szukanie przyczyny. A wystarczyło zapisać XML i wszystko jasne ;/

1 użytkowników online, w tym zalogowanych: 0, gości: 1