Dnes se podíváme na jednu užitečnou věc a to na serializaci dat do binární podoby. Občas se tato věc může hodit. Z vlastní zkušenosti můžu nabídnout jeden scénář a to, při ladění jedné aplikace bylo třeba uchovat informace obsažené v jedné třídě. Řešením bylo celý objekt zaserializovat a uložit do databáze v binárním tvaru spolu s dalšími informacemi. Pokud bylo třeba se k obsahu třídy vrátit, nebyl to problém a stačilo pouze deserializovat binární data z databáze a třída naplněná daty byla opět k dispozici.
No a jak na to? Princip je celkem jednoduchý, vezmeme objekt který chceme serializovat, například string a za pomoci objektu BinaryFormatter ho serializujeme do poměti. Poté z paměti uložíme po pole bytů a je hotovo.
BinaryFormatter shBF = new BinaryFormatter();
byte[] ArrayByte;
string sText = "Hello world";
using (MemoryStream strMemory = new MemoryStream())
{
shBF.Serialize(strMemory, sText);
ArrayByte = strMemory.ToArray();
}
Pokud bychom zatoužili po deserializaci takto serializovaných dat, dá se říci, že použijeme stejný postup s tím, že použijeme metodu pro deserializaci a vstupem budou logicky binární data a výstupem data původní, v našem případě opět typu
string.
BinaryFormatter shBF = new BinaryFormatter();
string sText;
using (MemoryStream strMemory = new MemoryStream(ArrayByte))
{
sText = (shBF.Deserialize(strMemory)).ToString();
}
A to je principiálně vše, nicméně by se asi hodilo to nějak zaobalit a ještě nebýt tak závislý na typu objektu, který chce serializovat nebo deserializovat. K tomu se nám bude hodit možnost využívat šablony. Takže je vhodné vytvořit třídu, která bude s takovou šablonou pracovat a do ní umístit dvě metody pro serializaci a deserializaci dat.
public class Serialize<Template>
{
public Serialize()
{
}
public byte[] GetSerialize(Template T)
{
BinaryFormatter shBF = new BinaryFormatter();
byte[] ArrayByte;
using (MemoryStream strMemory = new MemoryStream())
{
shBF.Serialize(strMemory, T);
ArrayByte = strMemory.ToArray();
}
return ArrayByte;
}
public Template GetDeserialize(byte[] ArrayByte)
{
BinaryFormatter shBF = new BinaryFormatter();
Template T;
using (MemoryStream strMemory = new MemoryStream(ArrayByte))
{
T = (Template)shBF.Deserialize(strMemory);
}
return T;
}
}
A tím jsme hotovi. Ještě pro úplnost přikládám tuto přeloženou třídu
SH.Utils.Serialize.dll a celou testovací
aplikaci.