Skip Navigation Links.
Skip Navigation Links.

.net student

microsoft

Vyhledávání v obsahu portálu


Přihlášení uživatele

Přihlášení uživatele

Členové:
  • Poslední nový uživatel Poslední: vavel
  • Nový dnes Dnes nových 2
  • Nový včera Včera nových: 6
  • Počet uživatelů: Celkem: 4413
Lidé online:
  • Návštěvníci: Návštěvníků: 29
  • Registrovaných Členů: 1
  • Celkem Celkem: 30
Mapa Stranek

MCTS 4. díl - Serializace

V dnešní díle se seznámíme s pojmem serializace a jejími typy. Průběžně si vše budeme ukazovat na ukázkových příkladech.

Serializace

Serializace je ve stručnosti řečeno konverze objektu na lineární sekvenci bytů a deserializace je proces opačný. S trochou fantazie serializace a deserializace funguje jako "Teleport" :-) Samotné windows využívají serializace pro mnoho důležitých úkolů, jako jsou např. webové služby, remoting či kopírování položek do schránky.

Serializace Objektu

Postup při serializaci:

  1. Vytvoření streamu ve kterém budeme chtít uchovávat serializovaná data
  2. Vytvoření isntance třídy BinaryFormatter
  3. Zavolání metody Serialize, kde prvním parametrem bude stream a druhým objekt

// pridame referenci System.Runtime.Serialization
// a nesmime zapomenout na tyhle namespace
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        // vytvorim si objekt, v mem pripade string, 
        // ktery budu chtit serializovat
        string str = "toto je test serializace";

        // Vytvorim si stream, ve kterem budu uchovavat
        // serializovany objekt
        using (FileStream fs =
            new FileStream("serializace.data", FileMode.OpenOrCreate))
        {
            // Vytvorim si instanci tridy BinaryFormatter
            BinaryFormatter binaryFormatter = new BinaryFormatter();

            // serializuju objekt
            binaryFormatter.Serialize(fs, str);
        }
    }
}

Serializovaný text vypadá takhle (Uvnitř souboru se nachází náš text a před ním i za ním je sekvence bytů sloužící pro deserializaci). Pokud bych si chtěl uložit string tak stačí když si ho pouze zapíšu do souboru a nemmusím využívat serializace, proto berte tuhle ukázku jenom jako informativní způsob jak serializovat data

 

 

Deserializace Objektu

Postup při deserializaci:

  1. Otevření streamu, který obsahuje serializovaná data
  2. Vytvoření instance třídy BinaryFormatter
  3. Vytvoření nového objektu, který bude uchovávat deserializovaná data
  4. zavolání metody Deserialize, kde parametrem bude stream a přetypováním na správný typ

static void Main(string[] args)
{
    // vytvorim si objekt ve kterem budu
    // uchovavat deserializovana data
    string novyStr = string.Empty;

    // Vytvorim si stream, ze ktereho budu cist data
    using (FileStream fs =
        new FileStream("serializace.data", FileMode.Open))
    {
        // Vytvorim si instanci tridy BinaryFormatter
        BinaryFormatter binaryFormatter = new BinaryFormatter();

        // deserializuju objekt
        novyStr = (string)binaryFormatter.Deserialize(fs);

        // vypisu obsah promenne novyStr
        Console.WriteLine(novyStr); // toto je test serializace
    }
}

Nyní se podíváme na způsob jak serializovat celé třídy. Představte si, že máme třídu, která obsahuje vlastnosti jméno a vek. Aby šla třída serializovat musíme jí označit atributem [Serializable].

[Serializable]
class Test
{
    private string m_Jmeno;
    private int m_Vek;
    private int m_RokNarozeni;
    public Test(string jmeno, int rokNarozeni)
    {
        m_Jmeno = jmeno;
        m_RokNarozeni = rokNarozeni;
        m_Vek = DateTime.Now.Year - rokNarozeni;
    }

    public string Jmeno
    {
        get { return m_Jmeno; }
        set { m_Jmeno = value; }
    }
    public int Vek
    {
        get { return m_Vek; }
        set { m_Vek = value; }
    }}

Vytořím tedy novou instanci a serializuju

static void Main(string[] args)
{
    Test t = new Test("ja", 1987);

    using (FileStream fs = new FileStream("Test.data", FileMode.OpenOrCreate))
    {
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(fs, t);
    }
}

Nyní soubor odešlu kamarádovi, který je bohužel zaneprázdněn a daný soubor deserializuje až po několika letech. Ovšem ve vlastnosti vek bude stale věk zadaný mnou. jak to tedy vyřešit ? Řešení je implementovat rozhraní IDeserializationCallback, které obsahuje metodu OnDeserialization. Tato metoda se provede při vykonávání deserializace a můžeme tedy ošetřit aby byl zadaný věk přepočítán

[Serializable]
class Test : IDeserializationCallback
{
    private string m_Jmeno;
    // vek tedy neni nutno serializovat, 
    // bude prepocitan behem deserializace
    [NonSerialized]
    private int m_Vek; 
    private int m_RokNarozeni;
    public Test(string jmeno, int rokNarozeni)
    {
        m_Jmeno = jmeno;
        m_RokNarozeni = rokNarozeni;
        m_Vek = DateTime.Now.Year - rokNarozeni;
    }

    public string Jmeno
    {
        get { return m_Jmeno; }
        set { m_Jmeno = value; }
    }
    public int Vek
    {
        get { return m_Vek; }
        set { m_Vek = value; }
    }

    #region IDeserializationCallback Members

    public void OnDeserialization(object sender)
    {
        m_Vek = DateTime.Now.Year - m_RokNarozeni;
    }

    #endregion
}

K serializaci můžeme využít místo BinaryFormatter tzv. SoapFormater. Jedná se o XML formát, tedy platformě nezávislý. Já se zde o SoapFormatteru moc zminovat nebudu a spíše se rovnou vrhnu na XML serializaci.

Lukáš Kubis :: 24. května 2008 :: 5093 shlédnutí :: 0 komentářů
kategorie: Obecná .Net témata

Comments

Nyní zde nejsou žádné kometáře. Buďte první!
Musíte být přihlášen pro posílání komentářů. Přihlásit se můžete zde
Přehled posledních diskuzí

Přehled posledních diskuzí

  1. Nekultura výlepu plakátů [11.21.2008 8:00 dop.]
    Proč proboha je na FEL ČVUT na Karláku budova polepena plakáty na zdech, přímo na omítce? Vrcholnou ukázkou je zeď před ...
  2. RE: SQL server 2008 MSDN AA [11.11.2008 7:26 odp.]
    Diky, ale tim to bohuzel neni.
  3. Dotaz na organizátory MS Festu [11.10.2008 4:31 odp.]
    Ahoj MSP,rád bych se zeptal jednoho z organizátorů MS Festu na jeden nestandardní dotaz, který se mi nechce psát na veře...
  4. RE: SQL server 2008 MSDN AA [11.08.2008 1:51 odp.]
    Dobrý den,pro spuštění instalace SQL Serveru 2008 je třeba mít nainstalován .NET Framework 3.5 Service Pack 1 - je to uv...
Novinky z klubů

Novinky z klubů

  1. Programátorské večery: Tipy a triky pro Visual Studio 13. listopadu 2008
    S Visual Studiem pracujeme každý den, ale málokdo zná šechny užitečné klávesov...
  2. Programátorské večery: PowerShell 12. listopadu 2008
    Platformu PowerShell již netřeba představovat. Co ovšem přináší pro .NET programátory...
  3. Programátorské večery: Entity Framework 30. října 2008
    Na této akci bude představena technologie Entity Framework. Podíváme se na tato témata: ...
  4. Programátorské večery: LINQ 26. října 2008
    LINQ je nový revoluční přístup pro práci s daty, který přichází s .NET ...
Co se píše jinde

Co se píše jinde

Řešení problémů s identitou webu u Personal Information Cards

Téměř přesně před rokem jsem si v článku Jak se zjišťuje identita webu u Personal Information Cards? stěžoval na to, ...

TechEd Developers 2008: Den druhý až čtvrtý

Konečně jsem získal dostatek času, abych sepsal zážitky z druhého až čtvrtého dne TechEdu.

TechEd Developers 2008: Den první

První den TechEdu je vždycky takový nanečisto, ostatně jsou v něm jenom dva přednáškové sloty. A keynote. Na co že se...

Výběr serveru

Výběr vhodného serveru představuje volbu při níž musíme přihlédnout k mnoha kritériím, které lze shrnout do následují...

Podívejte se své cache na zoubek

Robustní cacheovací mechanismus je jedna z nejužitečnějších technologií, jaké ASP.NET nabízí. Při vhodném použití můž...