All english written articles have English article tag and lays under horizontal line. First part is written in Czech.

neděle 22. července 2012

XNA a Serializace IV. / XNA and serialization IV.

Původně jsem myslel, že dnes ukáži kus kodu pro provádění samotného ukládání a načítání, ale když jsem odeslal a vypustil do světe poslední článek, došlo mi pak v posteli (mimo jiné nejlepší místo na přemýšlení), že jsem zapomněl napsat jak je to u dědičnosti. Pokusím se to dnes napraviti.
Stejně jako minule uděláme si ukázkové dvě třídy, kdy bude jedna odvozena od druhé.
public class A{
    public A(){
    
    }

    public A(GenericReader reader){
        int version=reader.ReadInt();
        //nacitani hodnot
    }
    
    public virtual void Serialize(GenericWriter writer){
        writer.Write(0);//verze
        //zapis ostatnich hodnot
    }
}

public class B:A{
    public B(){
    
    }

    public B(GenericReader reader):base(reader){
        int version=reader.ReadInt();
        //nacitani hodnot
    }

    public override void Serialize(GenericWriter writer){
        base.Serialize(writer);
        writer.Write(0);//verze
        //zapis ostatnich hodnot
    }
} 

Následující příklad jasně ukazuje co je potřeba provést. Při ukládání metodou Serialize, je nutné pokaždé zavolat metodu od předka. Dále je také důležité aby metoda přepisovala metodu původní, to ale jak jistě milý čtenář ví provedeme klíčovými slovy virtual a override. Načítání hodnot v konstruktorech je běžné. Pouze opět zavoláme konstruktor předka pomocí base. Důležité je vědět, že se nejprve zavolá konstruktor předka a teprve potom konstruktor současný. Proto se nejprve při zápisu volá metoda od předka. Pořadí hraje v binární serializaci důležitou roli!!
Tak a zítra se podíváme konečně na obslužný kod, který napsané metody využije a zavolá.



In today's article I will write about serialization of derived classes. I simply forgot write about them yesterday.
This is our example, let's have two classes A and B:
public class A{
    public A(){
    
    }

    public A(GenericReader reader){
        int version=reader.ReadInt();
        //reading values
    }
    
    public virtual void Serialize(GenericWriter writer){
        writer.Write(0);//version
        //writing values
    }
}

public class B:A{
    public B(){
    
    }

    public B(GenericReader reader):base(reader){
        int version=reader.ReadInt();
        //reading values
    }

    public override void Serialize(GenericWriter writer){
        base.Serialize(writer);
        writer.Write(0);//version
        //writing values
    }
} 

For saving values in Serialize method is important have this method virtual. This is done by keyword virtual and override as usual. Derived class MUST call method from base class and after that write all values. This must be done because of constructors. Constructors are invoked from the most base class (in C# object class) to top most. In binary serialization is order very important.
 See you tomorrow.

Žádné komentáře:

Okomentovat