Dnes sa pozrieme na triedu zodpovednú za ukladanie a čítanie zo súborov.
Úvod
Ukladanie súborov bude fungovať pomocou serializácie údajov do formátu XML. Preto si budeme musieť upraviť triedy Vector2 a Rectangle. Trieda na ukladanie sa bude volať FileController a bude to verejná statická trieda.
Úpravy
Triedy Vector2 a Rectangle sa budú jedny z vecí, ktoré budeme ukladať a preto musíme zabezpečiť, aby boli serializovatelné. To dosiahnete tým, že nad ich definíciu vložíte tag [Serializable]. Tiež sa uistite, že v triede Vector2 sú premenné X a Y public a v triede Rectangle musia byť public aj premenné Width a Height. Serializovatelné triedy musia mať k dispozícií prázdny konštruktor, ktorý teda vytvoríte a namiesto toho aby ste ho označili modifikátorom public alebo private, použite modifikátor internal. Vďaka tomu ho nebudete môcť omylom použiť.
Ukladanie
Teraz sa môžeme vrhnúť do triedy FileController. Ako prvú vytvoríme verejnú, statickú, generickú metódu Save, ktorá bude mať dva argumenty – jeden generického typu, ktorý bude označovať vstupné údaje a druhý bude typu string, ktorý bude obsahovať cestu k súboru.
Najprv vytvoríte nový XmlSerializer, ktorý použije generický typ ako svoj základ. Potom pomocou StreamWriteru serializujeme údaje.
public static void Save<T>(T data, string File) { XmlSerializer serializer = new XmlSerializer(typeof(T)); using (StreamWriter writer = new StreamWriter(File)) { serializer.Serialize(writer, data); } }
Čítanie
Podobným spôsobom vytvoríme aj opačnú metódu Load. Táto metóda bude mať generický výstup a jeden argument typu string, ktorý bude obsahovať cestu súboru.
Opäť použijeme XmlSerializer, ktorý inicializujeme rovnako ako pri ukladaní. Namiesto StreamWriteru však použijeme StreamReader.
public static T Load<T>(string File) { T data; XmlSerializer serializer = new XmlSerializer(typeof(T)); using (StreamReader reader = new StreamReader(File)) { data = (T)serializer.Deserialize(reader); } return data; }
Pomocná metóda na overenie existencie súboru
Napriek tomu, že trieda System.IO.File obsahuje metódu Exist, vytvoríme si vlastnú, ktorá ju bude vlastne len kopírovať.
public static bool Exist(string FileName) { return File.Exists(FileName); }
Toto robíme aby sme nemuseli používať namespace System.IO priamo v našej hre.
Po dnešnom kratšom diely si nabudúce ukážeme niečo dlhšie – budeme totiž pracovať na hlavnej hernej scéne. Takže sa uvidíme zas nabudúce.