Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.
Nakoniec si premenujeme naše ovládacie prvky zo základného mena na nejaké, aby sme sa v nich vyznali:
Pomenovanie komponentov ukážkovej aplikácie na serializáciu vo Visual Studio - Súbory a sieť vo Visual Basic .NET

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 interface ISerializable),
  • <XmlAttribute("Name")> zmení XML element z párového na nepárový a hodnota danej property bude v atribúte Name. 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é 6x (84.64 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB

 

Predchádzajúci článok
LINQ to XML vo VB.NET
Všetky články v sekcii
Súbory a sieť vo Visual Basic .NET
Preskočiť článok
(neodporúčame)
Riešené úlohy k 6.-10. lekciu práce so súbormi vo VB.NET
Článok pre vás napísal Dominik Horváth
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje programování v jazycích VB.NET a C#.
Aktivity