Serializacja - Kilka "użytkowników" w jednym xml

0

Witam, robię prosty program - klient pocztowy w vs2010.

Napotkałem na jeden problem, otóż obsługuje on maksymalnie jedno konto na raz. Jak zmusić serializację, by nie nadpisywała pliku - tylko dodawała nowe dane użytkowników.

Upragniona forma dokumentu wyglądać miałaby mniej wiecej tak:

<?xml version="1.0"?>
<ustawienia xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <uzytkownik1>
    <nazwaUzytkownika>nazwa</nazwaUzytkownika>
    <haslo>haslo</haslo>
    <ssl>false</ssl>
    <adresPop3>poczta.o2.pl</adresPop3>
    <portPop3>110</portPop3>
    <adresSmtp>poczta.o2.pl</adresSmtp>
    <portSmtp>587</portSmtp>
  </uzytkownik1>
  <uzytkownik2>
    <nazwaUzytkownika>nazwa</nazwaUzytkownika>
    <haslo>haslo</haslo>
    <ssl>false</ssl>
    <adresPop3>poczta.o2.pl</adresPop3>
    <portPop3>110</portPop3>
    <adresSmtp>poczta.o2.pl</adresSmtp>
    <portSmtp>587</portSmtp>
  </uzytkownik2>
itd...
</ustawienia> 

Oczywiście jeśli to możliwe chciałbym by było to jak najprostsze rozwiązanie, nie tyle co do samej serializacji co też do deserializacji.

0

Nie pokazałeś żadnego kodu. Serializuj listę: List<Uzytkownik>.
Poza tym zasadą XML-a jest nazywanie każdego obiektu takim samym tagiem, czyli

<uzytkownik>
  <nazwa>nazwa 1</nazwa>
  ...
</uzytkownik>
<uzytkownik>
  <nazwa>nazwa 2</nazwa>
  ...
</uzytkownik>

a nie <uzytkownik1>, <uzytkownik2> itd.

0

Tak - kodu nie dałem gdyż jeszcze nie wpadłem na pomysł by zrobić to za pomocą listy. A nie chciałem dawać czegoś co po prostu nie nawiązuje w żaden sposób do tematu - zrobiłem wedle zalecenia by zrobił go za pomocą listy (C# poznaję od przedwczoraj więc mogą być głupoty w kodzie)

List<odczyt> listaMaili = new List<odczyt>();
                    int odliczak = 0;
                    listaMaili.Add(new odczyt(odliczak++, Convert.ToString(mm.From), Convert.ToString(mm.To), mm.Subject, mm.Body, Convert.ToString(mm.DeliveryDate)));

                    XmlRootAttribute oRootAttr = new XmlRootAttribute();
                    oRootAttr.ElementName = "Mail";
                    oRootAttr.IsNullable = true;
                    XmlSerializer oSerializer = new XmlSerializer(typeof(List<odczyt>), oRootAttr);
                    StreamWriter oStreamWriter = null;
                    try
                    {
                        oStreamWriter = new StreamWriter("maile.xml");
                        oSerializer.Serialize(oStreamWriter, listaMaili);
                    }
                    catch (Exception oException)
                    {
                        Console.WriteLine("Aplikacja wygenerowała następujący wyjątek: " + oException.Message);
                    }
                    finally
                    {
                        if (null != oStreamWriter)
                        {
                            oStreamWriter.Dispose();
                        }
                    } 

Jednak on dalej nadpisuje plik maile.xml i wyświetla tylko ostatniego maila.

Oczywiście sprawdzałem czy lista funkcjonuje prawidłowo - więc błąd tkwi gdzieś w zapisie.

0

Przecież do listy dodajesz tylko jeden element, to jeden ci serializuje...
Lista musi zawierać wszystkie elementy, po czym RAZ na całej liście wywołujesz Serialize().

0

Może przedstawię więcej kodu.

        private void pobieranieMaili()
        {

           /* Tutaj są procedury pobierania maili dla danego konta*/

            for (int i = 1; i <= downloadNumberOfEmails; i++)
            {
                DemoClient.GetEmail(i, out mm);
                if (mm == null)
                {
                    Console.WriteLine("Email " + i.ToString() + " cannot be displayed.");
                }
                else
                {
                    List<odczyt> listaMaili = new List<odczyt>();
                    listaMaili.Add(new odczyt(Convert.ToString(mm.From), Convert.ToString(mm.To), mm.Subject, mm.Body, Convert.ToString(mm.DeliveryDate)));

                    serializacja(listaMaili);
                }
            }
            //close connection
            DemoClient.Disconnect();
        }

        private void serializacja(List<odczyt> listaMaili)
        {
            XmlSerializer oSerializer = new XmlSerializer(typeof(List<odczyt>));
            StreamWriter oStreamWriter = new StreamWriter("maile.xml");
            oSerializer.Serialize(oStreamWriter, listaMaili);
            oStreamWriter.Dispose();
        }

Więc jak widać dodawanie elementów do listy jest w pętli for, więc oczekiwałem że po prostu uzupełni listę danymi, następnie przekazuję tę listę do private void serializacja, gdzie ma dokonać na całej liście serializacji. Jednak jest efekt taki jak mówiłem, zapisuje tylko jeden - ostatni elemnt (ostatni mail) w xml-u

0

W pętli tworzysz za każdym razem nową listę.

0

Rzeczywiście działa. Dziwię się że sam tego nie zauważyłem, pozdrawiam :)

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