- Autor: Krzysztof Molenda
- Wersja: 2019-12-10
Celem ćwiczenia jest nabycie umiejętności w czytaniu (ze zrozumieniem) obcego kodu, wprowadzanie w nim korekt z zachowaniem istniejącej funkcjonalności oraz dodanie nowych funkcjonalności.
Głównym zadaniem jest zastosowanie mechanizmów serializacji do pliku stanu aplikacji, w celu późniejszego odtworzenia przy ponownym uruchomieniu.
Po wykonaniu ćwiczenia powinieneś:
- umieć przeprowadzić serializację i deserializację binarną obiektu i kolekcji obiektów,
- umieć przeprowadzić serializację i deserializację via
DataContract
obiektu i kolekcji obiektów do XML - umieć zaszyfrować i odszyfrować informacje.
W załączonych plikach zawarto realizację konsolową (jednowątkową) prostej gry w "Za dużo, za mało", tworzonej na kursie podstawowym C#. Aplikację zrealizowano wzorując się na wzorcu MVP (Model-Widok-Prezenter):
- plik
Gra.cs
- opisuje logikę gry (model) - plik
KontrolerCLI.cs
- zapewnia łączność między modelem a widokiem - plik
WidokCLI.cs
- dostarcza funkcjonalność związaną z obsługą konsoli.
Zadanie: Skompiluj, uruchom aplikację, zapoznaj się z jej działaniem. Zapoznaj się z kodem aplikacji i jej architekturą.
Aplikacja jeszcze nie jest skończona. O ile, ogólnie, działa poprawnie, o tyle funkcjonalność zakończenia jej w dowolnym momencie (wybranie X
) nie została jeszcze zaimplementowana.
Wprowadź poprawki do kodu.
Dostarcz funkcjonalność przerwania działania aplikacji (wybranie X
) działające według następującego scenariusza:
- Użytkownik kończy działanie aplikacji - poddaje się - odpowiadając na stosowne pytanie wyborem
X
lubx
. - Stan aplikacji zostaje zapamiętany na dysku, w pliku zlokalizowanym w folderze, w którym znajduje się program uruchomieniowy aplikacji.
- Aplikacja kończy działanie.
- Przy ponownym uruchomieniu aplikacji, wykrywa ona istnienie pliku, próbuje go odczytać.
- Jeśli odczyt jest poprawny, aplikacja komunikuje użytkownikowi, że jest możliwe odtworzenie stanu z poprzedniego uruchomienia, wyświetlając sumaryczne informacje dotyczące przerwanej rozgrywki (oczywiście bez poszukiwanej wartości).
- Jeśli użytkownik zdecyduje się na kontynuowanie poprzedniej rozgrywki, stan aplikacji sprzed zamknięcia zostaje przywrócony i rozgrywka toczy się dalej. Plik z zapamiętanym stanem poprzedniej rozgrywki zostaje usunięty.
- Jeśli użytkownik chce rozpocząć rozgrywkę od nowa, plik ze stanem gry zostaje usunięty i uruchamiana jest nowa gra.
Wprowadzone poprawki muszą być odporne na pojawienie się ewentualnych błędów (brak pliku, nie można zapisać pliku, plik uszkodzony, zapis stanu gry niewłaściwy, ...). Wprowadź odpowiednie przechwytywanie wyjątków i reakcje na nie, ale tak, aby nie kończyć działania aplikacji.
Skoryguj wyświetlanie historii gry. Wprowadź nowy stan gry Zawieszona
. Skoryguj obliczanie czasu trwania rozgrywki (nie uwzględnianie czasu jej zawieszenia).
Zadanie wykonaj w dwóch wariantach:
- Wykorzystaj serializację binarną
- Wykorzystaj serializację do XML via
DataContract
.
W tym drugim przypadku zapewnij odpowiedni poziom "tajności" zapisanego pliku poprzez zaszyfrowanie albo całego pliku, albo przynajmniej wartości odgadywanej. Ręczne poprawki wprowadzone do pliku XML mogłyby zafałszować kontynuowaną rozgrywkę.
Jeśli chcesz, dokonaj poprawek kosmetycznych kodu, wykonaj jego refaktoryzację według własnego punktu widzenia (np. stosując LINQ w niektórych sytuacjach), utrzymując ogólną funkcjonalność aplikacji.
Zmodyfikuj działanie aplikacji tak, aby co ustaloną liczbę sekund aplikacja automatycznie zrzucała swój stan do pliku. Zbudujesz wtedy automatyczny backup danych aplikacji. Nawet przerwanie awaryjne (Ctrl-C) nie pozbawi użytkownika możliwości kontynuowania tej niezmiernie ciekawej gry.
Podpowiedź: wielowątkowość.
- Binary serialization
- C# Serialization & Deserialization with Example
- Walkthrough: persisting an object using C#
- WCF: Serialization and Deserialization
- Serialization guidelines
- .NET Serializers Comparison Chart
- XML serialization in depth
- Cryptographic Services
- How to: Encrypt XML Elements with Symmetric Keys