10. diel - Serializácia a deserializácia vo VB.NET
V minulej lekcii, LINQ to XML vo VB.NET , sme sa naučili generovať, čítať a
editovať XML súbory pomocou technológie LINQ to XML a triedy
XDocument
.
V dnešnom tutoriále Súbory vo VB.NET si povieme niečo o serializácii a deserializácii.
Serializácia je uchovanie stavu objektu. Ide o konvertovanie objektu na prúd bytov a potom uloženie niekde do pamäte, databázy alebo súboru. Deserializácia je opak serializácie. Ide o prevedenie prúdu bytov späť na kópiu objektu.
Na čo je to dobré?
Serializácia nám umožní uložiť stav objektu. Pomocou deserializácie si ho môžeme potom kedykoľvek znova vytvoriť. Pomocou serializácie sa napríklad posielajú dáta cez sieť alebo sa ukladá nastavenie aplikácie.
Ukážková aplikácia
Založíme si nový projekt typu Windows Forms Application.
Trieda Uzivatel
Do projektu pridáme nejakú triedu, ktorej inštanciu by sme chceli
zachovať a pri opätovnom spustení aplikácie ju mať v stave, v akom sme ju
pri zatvorení aplikácie zanechali. Triedu nazveme Uzivatel
a
dáme jej vlastnosti Jmeno
, Prijmeni
a
DatumNarozeni
:
Public Class Uzivatel Public Property Jmeno As String Public Property Prijmeni As String Public Property DatumNarozeni As DateTime End Class
Všimnime si, že je trieda nastavená ako Public
,
aby jej deserializer mohol neskôr nastaviť.
Designer formulára Form1
Na hlavný formulár si pridáme:
- dva ovládacie prvky typu
TextBox
na meno a priezvisko, - ovládací prvok
DateTimePicker
, aby sme mohli určiť dátum užívateľa, - tlačidlo typu
Button
, ktorým budeme pridávať užívateľov do našej aplikácie, - prvok
ListBox
pre zobrazenie užívateľov.
Kód formulára Form1
Presunieme sa do kódu hlavného formulára Form1
, do ktorej si
dopíšeme privátnu kolekciu kolekciu typu List(Of Uzivatel)
, aby
sme mali užívateľov kde v aplikácii uchovávať:
Private uzivatele As List(Of Uzivatel) = New List(Of Uzivatel)
Designer formulára Form1
Presunieme sa späť do designera formulára. Pridáme si metódu k udalosti
Click
pri ovládacom prvku btnPridej
, do ktorej
napíšeme kód, ktorý pridá používateľa do našej kolekcie. Ďalej ešte
musíme ukázať užívateľa v prvku listBoxUzivatele
, k čomu
nám poslúži vlastnosť DataSource
:
Private Sub btnPridej_Click(sender As Object, e As EventArgs) Handles btnPridej.Click ' Vytvoríme nového užívateľa s dátami z našich komponentov Dim uzivatel As Uzivatel = New Uzivatel With { .Jmeno = tbJmeno.Text, .Prijmeni = tbPrijmeni.Text, .DatumNarozeni = dateTimePicker.Value } ' Pridáme ho do našej kolekcie uzivatele.Add(uzivatel) ' Obnovíme zdroj dát nášho listBoxuUžívateľa listBoxUzivatele.DataSource = Nothing listBoxUzivatele.DataSource = uzivatele End Sub
Trieda Uzivatel
Teraz už máme vcelku funkčnú aplikáciu. Keď aplikáciu spustíme a
skúsime používateľa pridať, uvidíme, že sa pridala vlastne len položka
"NazevProjektu.Uzivatel"
. Presunieme sa teda do triedy
Uzivatel
a prepíšeme metódu ToString()
:
Public Overrides Function ToString() As String Return "Meno: " + Jmeno + " Priezvisko: " + Prijmeni + " Dátum Narodenia: " + DatumNarozeni.ToShortDateString() End Function
Testovanie
Skúsme si pridať používateľa teraz. Vidíme, že sa užívateľ zobrazuje ľudskejšie
Serializácia
Teraz konečne môžeme prejsť na serializáciu dát. Presunieme sa do kódu formulára.
Kód formulára Form1
Tu si napíšeme metódu Serializuj()
:
Private Sub Serializuj() Try ' Vytvoríme si XmlSerializer na typ List(Of Používateľ) Dim serializer As XmlSerializer = New XmlSerializer(uzivatele.GetType()) ' Alternatívna forma, ako by to šlo tiež zapísať 'Dim serializer As XmlSerializer = New XmlSerializer(GetType(List(Of Uzivatel))) ' Vytvoríme Stream pomocou ktorého budeme serializovať Using sw As StreamWriter = New StreamWriter("uzivatele.xml") ' Zavoláme metódu Serialize, kde prvý parameter je Stream ' Ten sme vyvtorili o riadok vyššie ' Druhý parameter je objekt, ktorý serializujeme serializer.Serialize(sw, uzivatele) End Using Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub
Využili sme serializer do formátu XML. Serializérov je niekoľko typov vrátane binárneho, poskytuje nám ich už pripravené .NET framework. Nemusíme sa teda o nič starať, inštancie sa serializujú automaticky.
Designer formulára Form1
Teraz sa presunieme do designera a pri formulári nájdeme
Event (udalosť) OnClosing
, 2x klikneme av
obslužnom kóde zavoláme našu metódu Serializuj()
:
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing Serializuj() End Sub
Názov metódy sa môže líšiť podľa názvu hlavného
formulára. Ak ste jeho meno neupravovali, budete mať na začiatku najskôr
prefix Form1
.
Testovanie
Keď teraz spustíme program, pridáme nejakých užívateľov a program
zatvoríme, kolekcia užívateľov sa serializuje a uloží do
NazevProjektu/Bin/Debug/uzivatele.xml
. Keď súbor otvoríme, bude
vyzerať takto:
<?xml version="1.0" encoding="utf-8"?> <ArrayOfUzivatel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Uzivatel> <Jmeno>Jan</Jmeno> <Prijmeni>Novák</Prijmeni> <DatumNarozeni>1998-02-10T10:47:19</DatumNarozeni> </Uzivatel> <Uzivatel> <Jmeno>Jakub</Jmeno> <Prijmeni>Zlý</Prijmeni> <DatumNarozeni>2000-11-21T17:29:45</DatumNarozeni> </Uzivatel> </ArrayOfUzivatel>
Deserializácia
Serializáciu máme, tak teraz ešte deserializáciu. Z pohľadu kódu je to trošku ťažšie, a preto si radšej všetko vysvetlíme ešte raz.
Kód formulára Form1
V kóde hlavného formulára si napíšeme metódu
Deserializuj()
:
Private Sub Deserializuj() Try If File.Exists("používateľa.xml") Then Dim serializer As XmlSerializer = New XmlSerializer(uzivatele.GetType()) Using sr As StreamReader = New StreamReader("uzivatele.xml") uzivatele = CType(serializer.Deserialize(sr), List(Of Uzivatel)) End Using Else Throw New FileNotFoundException("Súbor nebol nájdený") End If Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub
Najprv musíme zistiť, či vôbec daný XML súbor s dátami existuje. Na to
nám poslúži trieda File
a jej metóda Exists()
, do
ktorej napíšeme cestu k nášmu súboru. Metóda vracia Boolean
.
Do tela podmienky vložíme XmlSerializer
na typ našej kolekcie
používateľov. Ďalej vytvoríme StreamReader
s cestou k nášmu
súboru.
Potom zavoláme metódu Deserialize()
z triedy
XmlSerializer
. Metóda Deserialize()
vracia
Object
. Musíme tu teda pretypovať, kým
priradíme uložených užívateľov k našim existujúcim.
Designer formulára Form1
Prejdeme do designera formulára. V Properties
(vlastnostiach) formulára nájdeme udalosť Load
a vytvoríme jej
obslužnú metódu. V nej zavoláme našu metódu Deserializuj()
a
načítame našich užívateľov do ovládacieho prvku ListBox
:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Deserializuj() listBoxUzivatele.DataSource = uzivatele End Sub
Názov metódy sa môže líšiť podľa názvu hlavného
formulára. Ak ste jeho meno neupravovali, budete mať na začiatku najskôr
prefix Form1
.
Testovanie
Aplikáciu spustíme, naplníme dátami, zatvoríme a znovu otvoríme. Vidíme, že obsahuje všetkých užívateľov, ktorých sme tam pridali
Záver
Trieda, ktorú serializujeme, musí obsahovať bezparametrický konštruktor (alebo žiadny parametrický). Je to z toho dôvodu, že deserializer si najskôr vytvorí prázdnu inštanciu a potom postupne zadáva vlastnosti, ako ich číta zo súboru (alebo iného streamu).
Nemôžeme serializovať ovládacie prvky, či už defaultné, alebo nami vytvorené (User Control).
K serializácii patrí niekoľko atribútov napr.
<XmlIgnore>
- nebude danú propertu serializovať,<Serializable()>
- dáva sa nad deklaráciu triedy a určuje objekt na serializáciu (Implementuje interfaceISerializable
),<XmlAttribute("Name")>
zmení XML element z párového na nepárový a hodnota danej property bude v atribúteName
. Napríklad<Uzivatel Name="Jan">
miesto<Jmeno>Jan</Jmeno>
.
V nasledujúcom cvičení, Riešené úlohy k 6.-10. lekciu práce so súbormi vo VB.NET, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 7x (84.64 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB