Laboratorium z przedmiotu Programowanie
Laboratorium z przedmiotu Programowanie
obiektowe
obiektowe
- zestaw 09
-
zestaw 09
Cel zajęć. Celem zajęć jest zapoznanie się z metodami pozwalającymi na zapis stanu
obiektu do pliku i jego odczyt w języku C#.
Wprowadzenie teoretyczne. Rozważana w ramach niniejszych zajęć tematyka jest
ważna, gdyż umożliwia na odtworzenie stanu obiektu np. w przypadku ponownego uruchomienia uprzednio zakończonej aplikacji. Aby ze zrozumieniem zrealizować zadania, przewidziane do wykonania w ramach zajęć laboratoryjnych, należy znać znaczenie takich zagadnień jak serializacja do pliku XML.
1. Serializacja – proces konwertowania obiektu lub kolekcji obiektów na format
nadający się do przesyłania za pośrednictwem sieci w formie strumienia lub do zapisania w pamięci, pliku czy bazie danych. Odwrotnym procesem jest deserializacja.
2. W technologii .NET zaimplementowano obsługę trzech głównych rodzajów tego procesu:
a. Serializację binarną – obiekty są serializowane do postaci strumienia binarnego b. Serializację protokołu SOAP – obiekty są serializowane do postaci kodu XML zgodnego z protokołem SOAP
c. Serializację do formatu XML – obiekty są serializowane do postaci XML
3. Serializacja obiektu do pliku XML – wymagania, informacje:
a. Klasa serializowanego obiektu musi zawierać publiczny konstruktor domyślny. b. Serializacji podlegają jedynie publiczne pola i właściwości (jeśli pole jest prywatne lub chronione, w celu serializacji jego wartości, należy zaimplementować odpowiednią właściwość dostępową).
c. Właściwości tylko do odczytu nie są serializowane.
d. Serializacji mogą ulegać obiekty standardowych klas kolekcji (np. „List<T>”).
Zadanie 1. Proszę zrealizować aplikację okienkową zgodnie z instrukcją z poprzednich
Zadanie 2. Proszę dodać buton „SaveToFile”. Ma ono powodować utworzenie pliku
tekstowego „data.txt” w głównym katalogu programu. W pliku tym mają być zapisane parametry studentów wprowadzonych do programu. Struktura pliku powinna wyglądać następująco: [[Student]] [FirstName] Jan [SurName] Kowalski [StudentNo] 10334 [Faculty] WIMiI [[]] [[Student]] [FirstName] Jan [SurName] Kowalski [StudentNo] 10334 [Faculty] WIMiI [[]] I tak dalej…
Podpowiedzi:
• Należy dołączyć przestrzeń nazw System.IO (poprzez słowo „using”, na początku pliku).
• Zapis wiersza do pliku można zrealizować w następujący sposób:
Zadanie 3. Proszę o dodanie przycisku „LoadFromFile”. Ma ono powodować odczytanie
z pliku tekstowego „data.txt”, danych studentów i wprowadzenie ich do programu. .
Podpowiedź:
Odczyt wszystkich wierszy z pliku (po kolei) można zrealizować w następujący sposób:
Zadanie 4. Proszę dodać wersję zapisu/odczytu opierającą się o dynamiczną serializację
obiektów wykorzystującą refleksję. System.Reflection dostarcza mechanizmów pozwalających dynamicznie już z poziomu uruchomionego programu odnosić się do kodu aplikacji, np. odczytywać nazwy pól, właściwości, metod oraz klas. Dodatkowo pozwala również dynamicznie tworzyć nowe obiekty oraz je modyfikować na podstawie nazw class, atrybutów itp.
Poniższy przykład przyjmuje dowolny obiekt. Dynamicznie pobiera jego typ (GetType()), odczytuje nazwę klasy (t.FullName), następnie pobiera listę właściwości klasy (t.GetProperties()), na koniec wypisuje nazwy i wartości (toString()) pobranych właściwości. Ten fragment kodu zserializuje właściwości dowolnej klasy.
Poniższy przykład utworzy dynamicznie obiekt (Activator.CreateInstance(String)) i zainicjuje go danymi z pliku (tob.GetProperty(String), property.SetValue(String)). Obiekt musi spełniać jedynie warunek, że musi dziedziczyć po T (Type.IsAssignableFrom(Type)) może natomiast mieć inny typ określony w pliku.
Wywołanie: Load<Student>(sr);, Load<Car>(sr);
9. Proszę dodać button „SaveToXml”, którego akcja utworzy plik XML „data.xml” w
głównym katalogu programu, do którego zapisane zostaną dane wprowadzone do programu.
Podpowiedzi:
Należy dołączyć przestrzeń nazw System.Xml.Serialization. Należy poddać serializacji kolekcję typu List<Samochod>. Przykładowa serializacja obiektu typu Budynek:
10. Proszę dodać button „LoadFromXml”, którego akcja zdeserializuje dane z pliku XML
Podpowiedź:
Przykładowa deserializacja obiektu typu Budynek:
Zadanie do domu
1. Proszę o modyfikację powyższego zadania, która ma polegać na określeniu przez
użytkownika ścieżki zapisywanego/odczytywanego pliku txt i xml. W tym celu proszę o wykorzystanie kontrolek typu OpenFileDialog, SaveFileDialog.
2. Proszę o obsługę sytuacji wyjątkowych, które mogą pojawić się podczas odczytu pliku
txt i xml, gdy jego struktura będzie nieprawidłowa. Komunikat o błędzie ma zostać wyświetlony za pomocą klasy MessageBox.
3. Po poprawnie wykonanym zapisie/odczycie plików, proszę o wyświetlenie
odpowiedniego komunikatu za pomocą klasy MessageBox.
4. Stwórz klasę StreamEnumerable<T>, która przyjmuje w konstruktorze obiekt
StreamReader. Zaimplementuj w nim interfejs IEnumerable (instrukcja 4). Metoda MoveNext() Enueratora ma odczytywać z pliku pojedynczy obiekt klasy T. Można
wykorzystać metodę T Load<T>(StreamReader sr) z obecnej instrukcji. Poprawna implementacja pozwoli wykonywać zapytania linq (Where(), Single()) bezpośrednio na piliku bez wczytywania całej zawartości do pamięci.