csharp-serializasiyanin-esaslari--1-ci-hisse---binar-serializasiya

C# serializasiyanın əsasları -1-ci hissə - Binar Serializasiya

.NET platformasında kənar texnologiyalar olan xml,json və.s formatlı məlumatlarla işləyən zaman ən çox istifadə etdiyimiz texnikalardan biri məhz serializasiya və deserializasiya prosesidir. Bu məqaləmizdə BinarySerialization haqda danışacağıq. Hir bir serializasiya növü üçün ayrı məqaləmiz olacaq.

PS: Kodları buradan yükləyə bilərsiniz.

Serializasiya və Deserializasiya nədir?

Serializasiya prosesi movcud obyektin başqa bir texnoloji vahidə(xml,json,binary və.s) çevrilməsi prosesidir.

Deserializasiya isə həmin texnoloji vahiddə saxlanlan informasiyanın geriyə, .NET obyektinə çevrilməsi prosesidir.

Serializasiya nə zaman istifadə olunur?

Serializasiya prosesi ən çox .NET platformasında obyektlərdə olan məlumatların , başqa texnoloji vahidə çevrilərək ötürülməsi və ya saxlanılması üçün istifadə olunur. Misal: Əgər bizdə hər hansı bir obyekt varsa və bu obyektdəki məlumatları xml formatında saxlamaq və ya servis vasitəsilə xml vəya json-a çevirib göndərmək lazımdırsa ozaman həmin obyekti serializasiya edirik.

Serializasiya konvertasiya deyil!

               Serializasiya prosesi adətən konvertasiya prosesinə bənzəyir. Sadəcə konvertasiya .NET ekosistemi tərkibində olan bir tipdən başqa tipə keçmək üçün istifadə olunan addırsa, serializasiya daha irəli gedərək .NET platformasından kənarda müstəqil mövcud olan bir texnoloji vahidə çevrilmə prosesidir.

               Obyektin serializasiya oluna bilməsi üçün klası Serializable atributu ilə göstərmək lazımdır.Əgər serializasiya vaxtı bu atributu göstərməsək aşağıdakı kimi problemlə rastlaşırıq.

 Klasın tərkibində olan hər hansı bir üzvün serializasiya olunmasını istəmiriksə ozaman həmin üzvü NonSerializable atributu ilə qeyd edirik. Bu atribut property-lər üçün keçərli deyil! Mütləq şəkildə həmin üzv serializasiya vaxtı field olmalıdır.

Törəmə vaxtı atribut bala(child) klasa keçə bilmədiyinə görə mütləq şəkildə törəyən klasın da Serializable atributu ilə qeyd olunması vacibdir.


.NET platformasında 4 cür əsas serializasiya forması var:

1)     Binary serialization

2)     Xml serialization

3)     Json serialization

4)     SOAP serialization


Binary serialization

               Əgər hər hansı bir obyekti binar formatda serializə edib saxlamaq və ya RPC ilə bir kompyuterdən obirinə göndərmək lazımdırsa ozaman həmin obyekti binar serializasiya etmək lazımdır.

Mscorlib assembly-sinin içərisində yerləşən BinaryFormatter klası vasitəsilə verilən informasiyanı binary formatda serializasiya etmək olur. Bununçün sadəcə System.Runtime.Serialization.Formatters.Binary adsahəsini qoşmaq lazımdır.

Qeyd edim ki, Binary və SOAP serializasiya üçün nəzərdə tutlan İFormatter interfeysi aşağıdakı funksionallığa malikdir.

public interface IFormatter
{
    SerializationBinder Binder { get; set;}
    StreamingContext Context { get; set;}
    ISurrogateSelector SurrogateSelector  { get; set;}
    object Deserialize (Stream serializationStream);
    void Serialize (Stream serializationStream, object graph);
}

Verilmiş obyekti serializasiya etmək üçün System.İO adsahəsində yerləşən FileStream klasından istifadə edəcəyik. Çünki serializasiya olunan obyekti fayl sisteminə yazmaq lazımdır. Əgər Obyekti sərt diskə yazmaq yox, operativ yaddaşda saxlamaq, şəbəkə üzərindən ötürmək istəsəniz ozaman başqa Stream variantlarından istifadə edə bilərsiniz.

               Obyekti serializasiya etmək üçün BinaryFormatter klasının Serialize() metodundan istifadə edirik. Bu metod əsasən 2 arqument alır. Arqumentlərdən birində Stream obyektini göstəririk ki, məhz obyekti haraya yazmaq istəyirik. İkinci arqumentdə isə hansı obyekti seriaalizasiya edəcəyimiz göstəririk.

Serializasiya üçün solution-mızda 2 proyekt yaratmışıq. SerializableObjects adlanan proyektdə serializasiya olunacaq klaslarımız yerləşir:

 [Serializable]
   public class Card
    {
        public int Id { get; set; }
        public string Number { get; set; }
        public ushort CVC { get; set; }
        public DateTime ExpireDate { get; set; }
        public string CardHolder { get; set; }
      
    }

Person klası isə belədir:

 [Serializable]
   public class Person
    {
        public Person()
        {
            Cards = new List();
        }
        public int Id { get; set; }
        public string Name { get; set; }
        public string Surname { get; set; }


        public byte Age { get; set; }
        public string Email { get; set; }


        public List Cards { get; set; }
    }

Proyekti mümkün qədər sadə saxlamaq üçün birbaşa baza ilə yox, operativ yaddaş modelləşdirilməsi ilə məlumatları saxlayırıq. Bununçün İnMemoryDb adlanan klasımız var:

  public class InMemoryDb
    {
        public List People { get; set; }
        public List Cards { get; set; }
        public InMemoryDb()
        {
            #region initialize datas


            Cards = new List
            {
                new Card
                {
                     Id  =1,
                      CardHolder = "MR. IZUKU MIDORIYA",
                       CVC  = 456,
                        ExpireDate  = DateTime.Now.AddYears(2),
                          Number = "1234-1234-1234"


                },
                 new Card
                {
                     Id  =2,
                      CardHolder = "MR. IZUKU MIDORIYA",
                       CVC  = 233,
                        ExpireDate  = DateTime.Now.AddYears(2),
                          Number = "1234-1234-1234"


                },
                  new Card
                {
                     Id  =3,
                      CardHolder = "MR. SHOTO TODOROKI",
                       CVC  = 788,
                        ExpireDate  = DateTime.Now.AddYears(2),
                          Number = "1999-1999-1999-1993"


                }
            };


            People = new List
            {
                new Person
                {
                      Id = 1,
                      Age = 34,
                      Email = "",
                      Name ="Izuku",
                      Surname = "Midoriya",
                       Cards = new  List
                       {
                           Cards[0],Cards[1]
                       }
                       
                },
                  new Person
                {
                      Id = 2,
                      Age = 24,
                      Email = "",
                      Name ="Katsumi",
                      Surname = "Bakugo"
                },
                   new Person
                {
                      Id = 3,
                      Age = 34,
                      Email = "",
                      Name ="Shoto",
                      Surname = "Todoroki",
                       Cards = new List
                       {
                            Cards[2]
                       }
                }
            };


         
            #endregion
        }


    }

Binary Serializasiyası həyata keçirtmək üçün BinaryFormatter klasının Serialize() metodunu aşağıdakı formada çağırırıq:


          InMemoryDb db = new InMemoryDb();
            List people = db.People;

            BinaryFormatter serializeAsBinary = new BinaryFormatter();
            using (FileStream fs = new FileStream("personInfo.dat", FileMode.OpenOrCreate))
            {
                serializeAsBinary.Serialize(fs, people[0]);
            }

Binary formatında serializasiya vaxtı klasa daxil olan digər klaslar da avtomatik olaraq bütün dataları ilə birgə serializasiya olunurlar.

Obyekt serializasiya olunduqdan sonra personİnfo.dat faylını açsaq içərisində belə bir informasiya görəcərik.

Buradan aydın görünür ki, serializasiya zamanı obyekti property-lərindəki qiymətlər field formasında faylda saxlanılır.

               Əgər verilən obyekti deserializasiya etmək istəyiriksə ozaman sadəcə Stream vasitəsilə həmin faylı oxuyub oradakı məlumatın hansı obyektə deserializasiya olunacağını göstərmək kifayətdir.

             Person person = null;
            using (FileStream fs = new FileStream("personInfo.dat", FileMode.OpenOrCreate))
            {
               person = (Person)serializeAsBinary.Deserialize(fs);
            }


            Console.WriteLine(person.Name);

Verilən obyekti massiv şəklində serializasiya və deserializasiya prosesi də bənzəri formada yerinə yetirilir.

  InMemoryDb db = new InMemoryDb();
            List people = db.People;


            BinaryFormatter serializeAsBinary = new BinaryFormatter();
            using (FileStream fs = new FileStream("personInfo.dat", FileMode.OpenOrCreate))
            {
                serializeAsBinary.Serialize(fs, people);
            }


            List peopleDeserialized = new List();
            using (FileStream fs = new FileStream("personInfo.dat", FileMode.OpenOrCreate))
            {
                peopleDeserialized = (List)serializeAsBinary.Deserialize(fs);
            }


            Console.WriteLine(peopleDeserialized[0].Name);
            

 

 

 

Tural

Tural Süleymani

Süleymani Tural Microsoft-un MCSD statuslu mütəxəssisidir, 2008-ci ildən bu yana proqramlaşdırma üzrə tədris aparır

Müəllifin bu dildə ən son postları

Bu yazıları da bəyənə bilərsiniz