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

pátek 20. července 2012

XNA Serializace den po té / XNA Serialization the day after

Minule sem sepsal jaký máme možnosti a dneska se podíváme jak vlastně na to. Vybral jsem nakonec možnost druhou tedy, jeden soubor s indexem a druhý s daty. Samotné třídy jsem sebral (snad se to může) ze zdrojáků RunUO ze starší verze 2.0 RC1, tedy z té samé kterou používáme na ŽvB. Ti, kteří by se zajímali jak vlastně funguje (nebo jak si to představuju že to funguje) ukládání na již zmíněném RunUO snad také dostanou zajímavé informace. Třídy jsem vypreparoval a upravil tak, aby byly co nejjednodušeji a mohl je každý použít. Stáhnout si je můžete tady. Jak to vlastně celé funguje? Velmi snadno.Veškerou zapisovací parádu obstarávají dvě třídy: GenericReader a GenericWriter. Netřeba vysvětlovat co která asi bude dělat je to zřejmé již z jejich názvů. Třídy lze použít i k jiným možnostem ukládání, které jsem popsal v předešlém článku, možnosti se jen budou lišit samotným kodem, který je určen pro ukládání. Třídy obsahují ukládání základních datových typů se kterými se můžete běžně setkat. Jenže jak uložit třeba Vector2, Vector3 nebo Matrix (tedy matici) a jiné další? Také velmi snadno(jak jinak). Je možné je rozložit na prvky ze kterých jsou složeny. Vector2 na X a Y souřadnici, Vector3 na souřadnice tři, Matrix není nic jiného než 16 float čísel.

public void Write(Vector3 vector){
    if ((m_Index + 12) > m_Buffer.Length) Flush();
 
    Write(vector.X);
    Write(vector.Y);
    Write(vector.Z);
}

public Vector3 ReadVector3(){
    return new Vector3(ReadFloat(), ReadFloat(), ReadFloat());
}

Horší situace nastane pokud budeme chtít ukládat třeba třídu Model, Texture2D a další věci načítané pomocí Content Pipeline. Zde to lze snadno obejít, uložíme pouze jména souborů a ty potom běžně po proběhnutí serializace načteme. Uložit lze i obsah delegátů, ale o triku který jsem na ně vymylel napíši něco později. Jediné na co je potřeba myslet je to, že je nutné zapisovat a číst prvky ve stejném pořadí.

Jak používat tyto třídy opět v dalším článku.



In my last post about basic of serialization I wrote something about possible ways. In this post I want to introduce classes for reading and writing into binary files. I modified classes from RunUO 2.0 RC1 source, that is used as Ultima Online emulator on ŽvB project and add reading and writing code for some XNA classes. Code can be downloaded from here. Reading and writing those types is very simple. Vector2, Vector3 or Matrix are only couple of floats. Vector2 have two X and Y, Vector3 have three and Matrix is only set of 16 floats. Here is example of serialization of Vector3:

public void Write(Vector3 vector){
    if ((m_Index + 12) > m_Buffer.Length) Flush(); 
 
    Write(vector.X);
    Write(vector.Y);
    Write(vector.Z);
}

public Vector3 ReadVector3(){
    return new Vector3(ReadFloat(), ReadFloat(), ReadFloat());
}

Texture2D, Model etc.. (basically all classes that are loaded by content pipeline) classes needs to be stored as strings. Simply write only file names of that assets and then load them by Content Pipeline. Only one thing is important. All parts needs to be written and read in same order.

In next article I will show you my code that handles saving and loading.

Žádné komentáře:

Okomentovat