Nie działająca deserializacja XML

0

Witam mam pewien problem z deserializacją z xmla (tak mi się wydaje przynajmniej)
męczę się z tym już naprawdę długo i nie potrafię dojść do tego w czym problem
Program ma odczytać dane z pliku xml i zapisać w pliku csv i wyświetlić kilka rzeczy(ale nie w tym problem)

Kod wygląda tak:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace Kolos
{
    public abstract class Pracownicy
    {
        public string imie { get; set; }
        public string nazwisko { get; set; }
        public string pesel { get; set; }
        public int staz { get; set; }
    }

    public class biurowi : Pracownicy, IComparable
    {
        public int zasadnicza { get; set; }
        public biurowi(int a)
        {
            zasadnicza = a;
        }
      

        public int CompareTo(object obj)
        {
            if (obj == null)
            {
                throw new ArgumentException("null");
            }

            biurowi otherbiurowi = obj as biurowi;
            if (otherbiurowi != null)
                return this.staz.CompareTo(otherbiurowi.staz);
            else
                throw new ArgumentException("bład wejscia");
        }

        public string tostringCSV()
        {
            return this.imie + ";" + this.nazwisko + ";" + this.pesel + ";" + this.staz + ";" + this.zasadnicza;
        }

        public static void savebiurowi(List<biurowi> a)
        {
            List<biurowi> biurowy = new List<biurowi>();
            biurowy = a;

            if (!File.Exists(@"..\..\Data\biur.csv"))
            {
                File.Delete(@"..\..\Data\biur.csv");
            }

            FileStream fs = File.Create(@"..\..\Data\biur.csv");
            fs.Close();

            StreamWriter sw = new StreamWriter(@"..\..\Data\biur.csv");

            Console.WriteLine();
            foreach (biurowi I in biurowy)
            {
                sw.WriteLine(I.tostringCSV());

            }
            sw.Close();
        }
        public static double pensja(int zasadnicza, int staz)
        {
            double premia = staz * 2 * zasadnicza;
            return zasadnicza + premia;
        }
    }
    public class produkcyjni : Pracownicy, IComparable
    {
        public int godziny { get; set; }
        public double stawka { get; set; }
        public produkcyjni(int a, double b)
        {
            godziny = a;
            stawka = b;
        }

       

        public int CompareTo(object obj)
        {
            if (obj == null)
            {
                throw new ArgumentException("null bro");
            }

            produkcyjni otherprodukcyjni = obj as produkcyjni;
            if (otherprodukcyjni != null)
                return this.staz.CompareTo(otherprodukcyjni.staz);
            else
                throw new ArgumentException("coś nie pykło bro");
        }

        public string tostringCSV()
        {
            return this.imie + ";" + this.nazwisko + ";" + this.pesel + ";" + this.staz + ";" + this.godziny + ";" + stawka;
        }

        public static void saveprodukcyjni(List<produkcyjni> a)
        {
            List<produkcyjni> produkcyjny = new List<produkcyjni>();
            produkcyjny = a;

            if (!File.Exists(@"..\..\Data\prod.csv"))
            {
                File.Delete(@"..\..\Data\prod.csv");
            }

            FileStream fs = File.Create(@"..\..\Data\prod.csv");
            fs.Close();

            StreamWriter sw = new StreamWriter(@"..\..\Data\prod.csv");

            Console.WriteLine();
            foreach (produkcyjni I in produkcyjny)
            {
                sw.WriteLine(I.tostringCSV());

            }
            sw.Close();
        }
        public static double pensja(int godziny, double stawka)
        {
            return godziny * stawka;
        }

    }

    public class BiurowyCollection
    {

        public List<biurowi> Biurowy { get; set; }

        public BiurowyCollection(List<biurowi> a)
        {
            Biurowy = a;
        }

        public BiurowyCollection() { }

        // Serializacja
        public void Save(string path)
        {
            var serializer = new XmlSerializer(typeof(BiurowyCollection));
            using (var stream = new FileStream(path, FileMode.Create))
            {
                serializer.Serialize(stream, this);
            }
        }

        // Deserializacja
        public static BiurowyCollection Load(string path)
        {
            var serializer = new XmlSerializer(typeof(BiurowyCollection));
            using (var stream = new FileStream(path, FileMode.Open))
            {
                return serializer.Deserialize(stream) as BiurowyCollection;
            }
        }
    }

    public class ProdukcyjnyCollection
    {

        public List<produkcyjni> Produkcyjny { get; set; }

        public ProdukcyjnyCollection(List<produkcyjni> a)
        {
            Produkcyjny = a;
        }

        public ProdukcyjnyCollection() { }

        // Serializacja
        public void Save(string path2)
        {
            var serializer = new XmlSerializer(typeof(ProdukcyjnyCollection));
            using (var stream = new FileStream(path2, FileMode.Create))
            {
                serializer.Serialize(stream, this);
            }
        }

        // Deserializacja
        public static ProdukcyjnyCollection Load(string path2)
        {
            var serializer = new XmlSerializer(typeof(ProdukcyjnyCollection));
            using (var stream = new FileStream(path2, FileMode.Open))
            {
                return serializer.Deserialize(stream) as ProdukcyjnyCollection;
            }
        }
    }

    class Program
    {
        delegate double delegate1(int x1);

        static void Main(string[] args)
        {
            List<biurowi> Biurowy = new List<biurowi>();
            List<produkcyjni> Produkcyjny = new List<produkcyjni>();

            string path = @"..\..\Data\biurowi.xml";
            string path2 = @"..\..\Data\produkcyjni.xml";

            var zdeserializowane = BiurowyCollection.Load(path);
            var zdeserializowane2 = ProdukcyjnyCollection.Load(path2);

            foreach (var element in zdeserializowane.Biurowy)
            {
                Biurowy.Add(element);
            }
            foreach (var element in zdeserializowane2.Produkcyjny)
            {
                Produkcyjny.Add(element);
            }

            foreach (biurowi i in Biurowy)
            {
                Console.WriteLine(i);
            }
            foreach (Pracownicy i in Produkcyjny)
            {
                Console.WriteLine(i);
            }

            Biurowy.Sort();
            Produkcyjny.Sort();

            biurowi.savebiurowi(Biurowy);
            produkcyjni.saveprodukcyjni(Produkcyjny);

            foreach (biurowi el in Biurowy)
            {
                Console.WriteLine(el.imie);
            }

            Console.ReadKey();

            

        }
    }
}
 

Kod trochę długi jak na wklejenie, ale inaczej tego nie zrobię a spoilerów nie ma :/
Mam problem z takim błędem w tym miejscu.
przeanalizowałem ten program kilka razy i jedyne co znalazłem to to że miałem pesel jako int (wychodzi poza zakres).

user image

Pliki xml wyglądają tak:
1.

<?xml version="1.0"?>
<BiurowyCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Biurowi>
    <Biurowy>
      <imie>Marek</imie>
      <nazwisko>Adamczyk</nazwisko>
      <pesel>78091174632</pesel>
      <staz>16</staz>
      <zasadnicza>4500</zasadnicza>
    </Biurowy>
    <Biurowy>
      <imie>Jolanta</imie>
      <nazwisko>Adamska</nazwisko>
      <pesel>94102211266</pesel>
      <staz>1</staz>
      <zasadnicza>2500</zasadnicza>
    </Biurowy>
    <Biurowy>
      <imie>Mariola</imie>
      <nazwisko>Cebula</nazwisko>
      <pesel>83091174644</pesel>
      <staz>16</staz>
      <zasadnicza>3500</zasadnicza>
    </Biurowy>
    <Biurowy>
      <imie>Janusz</imie>
      <nazwisko>Dobry</nazwisko>
      <pesel>81050719311</pesel>
      <staz>14</staz>
      <zasadnicza>4500</zasadnicza>
    </Biurowy>
    <Biurowy>
      <imie>Ewelina</imie>
      <nazwisko>Dymna</nazwisko>
      <pesel>87041398661</pesel>
      <staz>8</staz>
      <zasadnicza>3500</zasadnicza>
    </Biurowy>
    <Biurowy>
      <imie>Wiktoria</imie>
      <nazwisko>Kus</nazwisko>
      <pesel>88121047321</pesel>
      <staz>5</staz>
      <zasadnicza>3000</zasadnicza>
    </Biurowy>
    <Biurowy>
      <imie>Jan</imie>
      <nazwisko>Markowski</nazwisko>
      <pesel>92011312356</pesel>
      <staz>3</staz>
      <zasadnicza>2500</zasadnicza>
    </Biurowy>
    <Biurowy>
      <imie>Tomasz</imie>
      <nazwisko>Nowak</nazwisko>
      <pesel>95102211252</pesel>
      <staz>1</staz>
      <zasadnicza>2500</zasadnicza>
    </Biurowy>
    <Biurowy>
      <imie>Karolina</imie>
      <nazwisko>Nowakowska</nazwisko>
      <pesel>89121047321</pesel>
      <staz>5</staz>
      <zasadnicza>3500</zasadnicza>
    </Biurowy>
    <Biurowy>
      <imie>Dominik</imie>
      <nazwisko>Smak</nazwisko>
      <pesel>80050719338</pesel>
      <staz>14</staz>
      <zasadnicza>3500</zasadnicza>
    </Biurowy>
    <Biurowy>
      <imie>Anna</imie>
      <nazwisko>Smyk</nazwisko>
      <pesel>81090923541</pesel>
      <staz>10</staz>
      <zasadnicza>4000</zasadnicza>
    </Biurowy>
  </Biurowi>
</BiurowyCollection>
 
<?xml version="1.0"?>
<ProdukcyjnyCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Produkcyjni>
    <Produkcyjny>
      <imie>Marek</imie>
      <nazwisko>Adamczyk</nazwisko>
      <pesel>75091174657</pesel>
      <staz>15</staz>
      <godziny>160</godziny>
      <stawka>18</stawka>
    </Produkcyjny>
    <Produkcyjny>
      <imie>Adam</imie>
      <nazwisko>Kowalski</nazwisko>
      <pesel>90011312335</pesel>
      <staz>5</staz>
      <godziny>160</godziny>
      <stawka>15</stawka>
    </Produkcyjny>
    <Produkcyjny>
      <imie>Ewa</imie>
      <nazwisko>Nowak</nazwisko>
      <pesel>85041398642</pesel>
      <staz>2</staz>
      <godziny>150</godziny>
      <stawka>12.5</stawka>
    </Produkcyjny>
    <Produkcyjny>
      <imie>Natalia</imie>
      <nazwisko>Nowakowska</nazwisko>
      <pesel>87121047386</pesel>
      <staz>6</staz>
      <godziny>140</godziny>
      <stawka>15</stawka>
    </Produkcyjny>
    <Produkcyjny>
      <imie>Jan</imie>
      <nazwisko>Tomaszewski</nazwisko>
      <pesel>92102211231</pesel>
      <staz>1</staz>
      <godziny>178</godziny>
      <stawka>12.5</stawka>
    </Produkcyjny>
    <Produkcyjny>
      <imie>Adam</imie>
      <nazwisko>Tyrkowski</nazwisko>
      <pesel>80050719356</pesel>
      <staz>10</staz>
      <godziny>178</godziny>
      <stawka>18</stawka>
    </Produkcyjny>
  </Produkcyjni>
</ProdukcyjnyCollection>
 

Będę bardzo wdzięczny za jakąkolwiek pomoc :D

1

Tak tylko zapytam - tego as używasz świadomie, wiesz, że w przypadku "problemu" nie masz żadnej o tym informacji, tylko nulla?

0

Używam nieświadomie, Taki przykład dostałem na laboratoriach i po prostu z tego skorzystałem :)

1

To się zapoznaj z różnicami. Tymczasem w serializowanych klasach dodaj "domyślne" konstruktory (np. public biurowi() {});

1

Witam,

A czy tak nie lepiej zorganozować sobie serializację twojej kolekcji obiektów?

namespace ConsoleApplicationXmlSerializerProgram
{
    using System.Collections.Generic;
    using System.Xml.Serialization;
 
    /// <summary>
    /// TODO: Update summary.
    /// </summary>
    [XmlRoot("BiurowyCollection")]
    public class BiurowyCollection: List<biurowi>
    {
 
    }
}

Pozdrawiam,

mr-owl

0

Poprawione i działa :D te pliki xml nie "pasowały" do deserializacji, przez co wczytywało puste dane :D
kwestia dodania:

[XmlArray("Biurowi"), XmlArrayItem("Biurowy")] 

by je poprawnie odczytywało.
Dzięki Mr-Owl za naprowadzenie :D

Wrzucam kod może komuś się przyda :)

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace Kolos
{
    public abstract class Pracownicy
    {
        public string imie { get; set; }
        public string nazwisko { get; set; }
        public string pesel { get; set; }
        public int staz { get; set; }
    }

    public class Biurowi : Pracownicy, IComparable
    {
        public int zasadnicza { get; set; }

        public Biurowi(int a)
        {
            zasadnicza = a;
        }

        public Biurowi() { }


        public int CompareTo(object obj)
        {
            if (obj == null)
            {
                throw new ArgumentException("null");
            }

            Biurowi otherbiurowi = obj as Biurowi;
            if (otherbiurowi != null)
                return this.staz.CompareTo(otherbiurowi.staz);
            else
                throw new ArgumentException("bład wejscia");
        }

        public string tostringCSV()
        {
            return this.imie + ";" + this.nazwisko + ";" + this.pesel + ";" + this.staz + ";" + this.zasadnicza;
        }

        public static void savebiurowi(List<Biurowi> a)
        {
            List<Biurowi> biurowy = new List<Biurowi>();
            biurowy = a;

            if (!File.Exists(@"..\..\Data\biur.csv"))
            {
                File.Delete(@"..\..\Data\biur.csv");
            }

            FileStream fs = File.Create(@"..\..\Data\biur.csv");
            fs.Close();

            StreamWriter sw = new StreamWriter(@"..\..\Data\biur.csv");

            Console.WriteLine();
            foreach (Biurowi I in biurowy)
            {
                sw.WriteLine(I.tostringCSV());

            }
            sw.Close();
        }
        public static double pensja(int zasadnicza, int staz)
        {
            double premia = staz * 2 * zasadnicza;
            return zasadnicza + premia;
        }
    }
    public class produkcyjni : Pracownicy, IComparable
    {
        public int godziny { get; set; }
        public double stawka { get; set; }
        public produkcyjni(int a, double b)
        {
            godziny = a;
            stawka = b;
        }

        public produkcyjni() { }




        public int CompareTo(object obj)
        {
            if (obj == null)
            {
                throw new ArgumentException("null bro");
            }

            produkcyjni otherprodukcyjni = obj as produkcyjni;
            if (otherprodukcyjni != null)
                return this.staz.CompareTo(otherprodukcyjni.staz);
            else
                throw new ArgumentException("coś nie pykło bro");
        }

        public string tostringCSV()
        {
            return this.imie + ";" + this.nazwisko + ";" + this.pesel + ";" + this.staz + ";" + this.godziny + ";" + stawka;
        }

        public static void saveprodukcyjni(List<produkcyjni> a)
        {
            List<produkcyjni> produkcyjny = new List<produkcyjni>();
            produkcyjny = a;

            if (!File.Exists(@"..\..\Data\prod.csv"))
            {
                File.Delete(@"..\..\Data\prod.csv");
            }

            FileStream fs = File.Create(@"..\..\Data\prod.csv");
            fs.Close();

            StreamWriter sw = new StreamWriter(@"..\..\Data\prod.csv");

            Console.WriteLine();
            foreach (produkcyjni I in produkcyjny)
            {
                sw.WriteLine(I.tostringCSV());

            }
            sw.Close();
        }
        public static double pensja(int godziny, double stawka)
        {
            return godziny * stawka;
        }

    }

    [XmlRoot("BiurowyCollection")]
    public class BiurowiCollection
    {
        [XmlArray("Biurowi"), XmlArrayItem("Biurowy")]
        public Biurowi[] biurowi { get; set; }
        public BiurowiCollection() { }

        public void Save(string path)
        {
            var serializer = new XmlSerializer(typeof(BiurowiCollection));
            using (var stream = new FileStream(path, FileMode.Create))
            {
                serializer.Serialize(stream, this);
            }
        }


        public static BiurowiCollection Load(string path)
        {
            var serializer = new XmlSerializer(typeof(BiurowiCollection));
            using (var stream = new FileStream(path, FileMode.Open))
            {
                return serializer.Deserialize(stream) as BiurowiCollection;
            }
        }



        [XmlRoot("ProdukcyjnyCollection")]
        public class ProdukcyjniCollection
        {
            [XmlArray("Produkcyjni"), XmlArrayItem("Produkcyjny")]
            public produkcyjni[] Produkcyjni { get; set; }
            public ProdukcyjniCollection() { }

            public void Save(string path)
            {
                var serializer = new XmlSerializer(typeof(ProdukcyjniCollection));
                using (var stream = new FileStream(path, FileMode.Create))
                {
                    serializer.Serialize(stream, this);
                }
            }


            public static ProdukcyjniCollection Load(string path)
            {
                var serializer = new XmlSerializer(typeof(ProdukcyjniCollection));
                using (var stream = new FileStream(path, FileMode.Open))
                {
                    return serializer.Deserialize(stream) as ProdukcyjniCollection;
                }
            }





            class Program
            {
                delegate double delegate1(int x1);

                static void Main(string[] args)
                {
                    List<Biurowi> Biurowy = new List<Biurowi>();
                    List<produkcyjni> Produkcyjny = new List<produkcyjni>();

                    string path = @"..\..\Data\biurowi.xml";
                    string path2 = @"..\..\Data\produkcyjni.xml";

                    var zdeserializowane1 = BiurowiCollection.Load(path);
                    var zdeserializowane2 = ProdukcyjniCollection.Load(path2);

                    foreach (var element in zdeserializowane1.biurowi)
                    {
                        Biurowy.Add(element);
                    }

                    foreach (var element in zdeserializowane2.Produkcyjni)
                    {
                        Produkcyjny.Add(element);
                    }


                    Biurowi.savebiurowi(Biurowy);
                    produkcyjni.saveprodukcyjni(Produkcyjny);


                    Console.ReadKey();


                }
            }
        }
    }
}

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