Wątek przeniesiony 2018-01-21 15:04 z C# i .NET przez somekind.

Jak wyświetlić listę obiektów z pliku? - deserializacja

0

Cześć, udało mi się stworzyć serializację danych do pliku, natomiast nie mogę sobie poradzić z odczytem.

public class Person
    {
        [XmlAttribute("Id")]
        public int PersonId { get; set; }
        [XmlElement("Imie")]
        public string FirstName { get; set; }
        [XmlElement("Nazwisko")]
        public string LastName { get; set; }
        [XmlElement("Wiek")]
        public int Age { get; set; }

        public Person()
        {
        }

        public Person(int nPersonId, string sFirstName, string sLastName, int nAge)
        {
            PersonId = nPersonId;
            FirstName = sFirstName;
            LastName = sLastName;
            Age = nAge;
        }
    }
class Program
    {
        static void Main(string[] args)
        {
            List<Person> oPersonsList = new List<Person>();
            int nCounter = 0;
            oPersonsList.Add(new Person(++nCounter, "Jan", "Kowalski", 23));
            oPersonsList.Add(new Person(++nCounter, "Agnieszka", "Nowak", 22));
            XmlRootAttribute oRootAttr = new XmlRootAttribute();
            oRootAttr.ElementName = "Persons";
            oRootAttr.IsNullable = true;
            XmlSerializer oSerializer = new XmlSerializer(typeof(List<Person>), oRootAttr);
            StreamWriter oStreamWriter = null;
            try
            {
                oStreamWriter = new StreamWriter("person.xml");
                oSerializer.Serialize(oStreamWriter, oPersonsList);
            }
            catch (Exception oException)
            {
                Console.WriteLine("Aplikacja wygenerowała następujący wyjątek: " + oException.Message);
            }
            finally
            {
                if (null != oStreamWriter)
                {
                    oStreamWriter.Dispose();
                }
            }

            StreamReader reader = new StreamReader("person.xml");

            XmlSerializer deserializer = new XmlSerializer(typeof(List<Person>));


            Console.WriteLine("Dane osoby:");
            Console.WriteLine("Imie: ");
            Console.WriteLine("Nazwisko: ");
            Console.WriteLine("Wiek: ");
            Console.ReadLine();
        }
    }

Jakieś podpowiedzi ^_^?

1

tą linijkę:

 XmlSerializer deserializer = new XmlSerializer(typeof(List<Person>));

zastąp tymi:

XmlSerializer deserializer = new XmlSerializer(typeof(List<Person>), oRootAttr);
List<Person> lista = deserializer.Deserialize(reader) as List<Person>;
0

A jak wywołać tutaj, żeby pokazywało w consoli?

Console.WriteLine("Dane osoby:");
            Console.WriteLine("Imie: ");
            Console.WriteLine("Nazwisko: ");
            Console.WriteLine("Wiek: ");
            Console.ReadLine();

Próbowałem oPersonsList.imie itd. lecz to niestety nie działa.

1

Bo oPersonsList to kolekcja, więc musisz ją przetwarzać w pętli albo odwoływać się do konkretnego elementu, np.: oPersonsList[0].imie.

0

Ta deserializacja niestety nie działa jak powinna, ponieważ gdy usunę StreamWriter'a i zostawię jedynie StreamReader'aa, aby odczytał dane obiektu z pliku, to niestety nic nie wyświetla. Gdy Streamwriter jest, to po prostu odczytuje poniższy kod

oPersonsList.Add(new Person(++nCounter, "Jan", "Kowalski", 23));
oPersonsList.Add(new Person(++nCounter, "Agnieszka", "Nowak", 22));

Są jakieś pomysły jak to naprawić/poprawić? Chciałbym to ogółem zrobić w osobnej klasie i dwóch metodach, jedna do zapisywania, druga do odczytu.

0

Nie za bardzo rozumiem o co chodzi z tym jak usuniesz StreamWritera. Ogólnie StreamWriter do zapisu, StreamReader do odczytu, jeśli deserializujesz to odczytujesz z pliku, więc StreamReader.

Serializacja:

var serializer = new XmlSerializer((oPersonsList).GetType());

using (var writer = new StreamWriter(filePath))
{
	serializer.Serialize(writer, oPersonsList);
}

Deserializacja:

var serializer = new XmlSerializer(oPersonsList.GetType());

if (File.Exists(filePath))
{
	using (var reader = new StreamReader(filePath))
	{
		XmlReader xmlReader = new XmlTextReader(reader);
		if (serializer.CanDeserialize(xmlReader))
		{
			oPersonsList = ((List<Person>)serializer.Deserialize(xmlReader));
		}
	}
}

Mogą być jakieś literówki, bo pisałem z palca. Najlepiej pokaż swój poprawiony kod, podejrzewam, że nie przypisujesz do niczego zdeserializowanego obiektu, więc nic Ci nie wyświetla, bo nic tam nie masz.

0

Hmm, nie udało mi się niestety nic zdziałać. Tym ćwiczeniem chciałem się nauczyć w sumie odczytywać z pliku xml, aby wyświetlało mi to w consoli, gdyż próbuję stworzyć w console app system konta(rejestrowanie, oraz logowanie). Może ktoś widział gdzieś w internecie jakieś dobre poradniki? Ja od kilku dni próbuję się z tym zmagać lecz na marne.
To wszystko chciałbym zrobić za pomocą listy obiektów, zapisywać to w pliku .xml, a następnie odczytywać to i poprzez [n]username == [n]password zrobić system logowania. Jak na ten moment nie umiem nawet odczytywać z pliku, dlatego stworzyłem ten temat :/

1
static void Main()
        {
            List<Person> oPersonsList = new List<Person>();
            int nCounter = 0;
            oPersonsList.Add(new Person(++nCounter, "Jan", "Kowalski", 23));
            oPersonsList.Add(new Person(++nCounter, "Agnieszka", "Nowak", 22));

            WriteConsole(oPersonsList);

            Serialize("person.xml", oPersonsList);

            oPersonsList.Add(new Person(++nCounter, "Zbyszek", "Kowalski", 45));
            oPersonsList.Add(new Person(++nCounter, "Adam", "Nowak", 37));

            WriteConsole(oPersonsList);

            oPersonsList = Deserialize("person.xml", oPersonsList);

            WriteConsole(oPersonsList);

            Console.ReadKey();
        }


        private static void WriteConsole(IEnumerable<Person> oPersonsList)
        {
            foreach (var person in oPersonsList)
            {
                Console.WriteLine("ID: {0}, Imie: {1}, Nazwisko: {2}, Wiek: {3} \n", person.PersonId, person.FirstName, person.LastName, person.Age);
            }
        }

        private static void Serialize(string filePath, List<Person> oPersonsList)
        {
            var serializer = new XmlSerializer((oPersonsList).GetType());

            using (var writer = new StreamWriter(filePath))
            {
                serializer.Serialize(writer, oPersonsList);
            }
            Console.WriteLine("SERIALIZE\n");
        }

        private static List<Person> Deserialize(string filePath, List<Person> oPersonsList)
        {
            var serializer = new XmlSerializer(oPersonsList.GetType());

            if (File.Exists(filePath))
            {
                using (var reader = new StreamReader(filePath))
                {
                    XmlReader xmlReader = new XmlTextReader(reader);
                    if (serializer.CanDeserialize(xmlReader))
                    {
                        oPersonsList = ((List<Person>)serializer.Deserialize(xmlReader));
                    }
                }
            }
            Console.WriteLine("DESERIALIZE\n");
            return oPersonsList;
        }

Mam nadzieję, że będzie jasne.

0

Dobra, już pisałem posta, że coś mi nie działa. Ale przeanalizowałem kod jeszcze raz, pokombinowałem bez serializacji itd i wszystko działa ^_^.
Dziękuję bardzo! Temat do zamknięcia.

// Jeszcze chciałem zapytać jak zrobić, żeby do istniejącej listy dodawało kolejne elementy, ale po prostu najpierw wstawiłem deserializację, potem dodanie do listy, serializacja i bingo :)
Jeszcze raz dzięki za pomoc!

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