C# Serializacja

0

Dzień dobry!
Mam taki problem, chodzi o serializację. Klasa Baza_autorów, zawiera listę autorów i funkcję zapisu do pliku xml.

    public class Baza_autorow
    {
        public List<Autor> autorzy = new List<Autor>();

        public Baza_autorow() { }

        //metody

        public void zapis_autorow()
        {
            StreamWriter wr = new StreamWriter("autorzy.xml");
            XmlSerializer serializer = new XmlSerializer(typeof(List<Autor>));
            serializer.Serialize(wr, autorzy);
            wr.Close();
        }
    }

W klasie Autor mam listę umów każdego autora

    public class Autor
    {
        public string imie;
        public string nazwisko;
        public List<Umowa> umowy = new List<Umowa>();

        public Autor() { }

        public Autor(string im, string na)
        {
            imie = im;
            nazwisko = na;
        }
        //metody
    }

Umowa_o_dzielo dziedziczy z klasy umowa

    public class Umowa
    {
        public string data_zawarcia;
        public string tytul;
        public double wynagrodznie;

        public Umowa() { }

        public Umowa(string d, string t, double w)
        {
            data_zawarcia = d;
            tytul = t;
            wynagrodznie = w;
        }
    }

    public class Umowa_o_dzielo : Umowa
    {
        public Umowa_o_dzielo() { }
        public Umowa_o_dzielo(string d, string o, double w) : base(d, o, w) { }
    }

Problem powstaje przy serializacji jeśli istnieje obiekt klasy Umowa_o_dzlielo "An unhandled exception of type 'System.InvalidOperationException' occurred in System.Xml.dll Additional information: Wystąpił błąd podczas generowania dokumentu XML."

Co mam napisać w metodzie zapis_autorow żeby działało, a może trzeba dodać jakieś atrybuty do klasy Umowa_o_dzielo?
Szukam cały dzień rozwiązania i ciągle nic :(
Z góry dziękuję za pomoc :)

0

przecież w C# musisz dodać atrybut [Serializable()] dla każdej klasy, której obiekty chcesz serializować

0

Dzięki za odpowiedź!
Niestety to nic nie zmienia, bo problem powstaje tylko i wyłącznie w momencie zapisywania obiektu klasy Umowa_o_dzielo.
Jeśli stworzę taki obiekt:

Umowa u1 = new Umowa(d, t, w);

Wszystko zapisuje się prawidłowo

Natomiast jeśli stworzę taki to przy zapisie pojawia się błąd

Umowa u1 = new Umowa_o_dzielo(d, t, w);
2
zajebioza napisał(a):

przecież w C# musisz dodać atrybut [Serializable()] dla każdej klasy, której obiekty chcesz serializować

Nie prawda.

@Janusz_programista
Sprawdzaj zawsze czy nie ma więcej informacji w InnerException.

[XmlInclude(typeof(Umowa_o_dzielo))]
   public class Umowa
   {   //...   }
0

Sprawdzaj zawsze czy nie ma więcej informacji w InnerException.

[XmlInclude(typeof(Umowa_o_dzielo))]
   public class Umowa
   {   //...   }

Działa!!!
@DibbyDum Dziękuję! :D

3
Janusz_programista napisał(a):

Co mam napisać w metodzie zapis_autorow żeby działało, a może trzeba dodać jakieś atrybuty do klasy Umowa_o_dzielo?
Szukam cały dzień rozwiązania i ciągle nic :(
Z góry dziękuję za pomoc :)

Trzeba dodać atrybut [XmlInclude(typeof(UmowaODzielo))]do klasy Umowa.

Warto byłoby też pisać w C#, trzymać się konwencji nazewniczych NazwaKlasy, a nie Nazwa_klasy, i używać właściwości zamiast publicznych pól.

zajebioza napisał(a):

przecież w C# musisz dodać atrybut [Serializable()] dla każdej klasy, której obiekty chcesz serializować

W przypadku serializacji binarnej, dla XML jest to zbędne.

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