Serializacja i deserializacja binarna C#

By | 29 września 2014

Bardzo często gdy zamierzamy serializować obiekt wybieramy format XML lub JSON, ponieważ pozwalają przechowywać dane w strukturze zrozumiałej również dla człowieka, a nie tylko dla maszyny. Jednak trzeba wiedzieć, że serializacje można przeprowadzić również do postaci binarnej i o tym napiszę w tym artykule.

Serializacja binarna jest bardzo prosta do wdrożenia, szybka, ale również posiada pewne mankamenty. Jednym z tych mankamentów jest utrata danych w przypadku zmiany struktury klasy deserializowanej, o co w przypadku XML czy JSON martwić się nie musimy.

Pierwszym etapem przygotowania aplikacji do wdrożenia serializacji binarnej, jest ustalenie które obiekty muszą być zapisywane do pliku. Gdy już to wiemy, to przygotowujemy klasy do serializacji poprzez dodanie przed deklaracją klasy ciągu: [Serializable]

Przykład:

[Serializable]

    public class Person
    {

        public String Imie { get; set; }

        public String Nazwisko { get; set; }

    }

Następnie musimy napisać klasę serializującą, albo skorzystać z klasy generycznej, która znajduje się poniżej:


    public static class BinarySerializer<T>
    {

        public static void Serialize(string path, T obj)
        {

            if (obj != null)
            {

                using (var fs = new FileStream(path, FileMode.Create))
                {

                    var bf = new BinaryFormatter();

                    bf.Serialize(fs, obj);

                }

            }

        }

        public static T Deserialize(string path)
        {

            T temp = default(T);

            if (File.Exists(path))
            {

                using (var fs = new FileStream(path, FileMode.Open))
                {

                    if (fs.Length > 0)
                    {

                        var bf = new BinaryFormatter();

                        return (T)bf.Deserialize(fs);

                    }

                }

            }

            return temp;

        }

    }

Następnie wystarczy już tylko użyć serializacji:


var person = new Person() { Imie = "Paweł", Nazwisko = "Trojanowski" };

string path = @"data.bin";

BinarySerializer<Person>.Serialize(path, person); //serializujemy

Person p = null;

p = BinarySerializer<Person>.Deserialize(path); //deserializujemy

Console.WriteLine(p.Imie + " " + p.Nazwisko);

Console.ReadKey();

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *