CodeGym /Kurslar /C# SELF /Serializasiya ilə tanışlıq

Serializasiya ilə tanışlıq

C# SELF
Səviyyə, Dərs
Mövcuddur

1. Giriş

Təsəvvür et ki, proqramındakı obyekt belə mürəkkəb, gözəl bir LEGO konstruktorudur. O, bir çox hissələrdən ibarətdir, hər biri öz yerindədir və bütün bunlar bir bütövlük təşkil edir. Konstruktor masanda (kompüter yaddaşında) durduğu müddətcə hər şey yaxşıdır. Amma əgər onu dostuna aparmaq (şəbəkə ilə göndərmək) və ya sadəcə növbəti dəfə üçün qutuda saxlamaq (diskə yazmaq) lazım olsa? Sadəcə onu götürüb üfüqi qutuya qoymaq olmaz! O, dağılacaq!

Məhz obyektin təhlükəsiz saxlanması və ya ötürülməsi üçün onun diqqətlə hissələrə ayrılması ilə serializasiya məşğul olur. Bu, obyektinizi onun "canlı" yaddaşdakı vəziyyətindən baytlar ardıcıllığına (və ya mətn təmsilinə) çevirmə prosesidir, onu fayla yazmaq, şəbəkə ilə göndərmək və ya clipboard-a qoymaq olar. Əslində, bu, konstruktoru diqqətlə sökmək, bütün parçaları paketlərə qoymaq, etiketləmək və daşınma və ya saxlama üçün qutuda qablaşdırmaq kimidir.

flowchart LR
    ObjectInMemory(Yaddaşdakı obyekt)
    Serialize[SERIALİZASİYA]
    BytesOrText[Baytlar / Mətn faylı / JSON / XML]
    Deserialize[DESERIALİZASİYA]
    ObjectAgain(Obyekt yenidən yaddaşda)

    ObjectInMemory -->|serialize| Serialize
    Serialize --> BytesOrText
    BytesOrText -->|deserialize| Deserialize
    Deserialize --> ObjectAgain

Və əlbəttə, əgər nəyisə qablaşdırmısınızsa, onu açmağı da bacarmalısınız! Əks prosesə deserializasiya deyilir. Bu, o qutuya qoyulmuş LEGO-parçalarını götürüb boşaltmaq və sonra təlimatlara (və ya necə qurulduğunu yadında saxlayaraq) əməl edərək, obyekti yaddaşda paketlənməzdən əvvəlki eyni vəziyyətə qaytarmaq deməkdir. Belədir, sehr!

"Serializasiya" termini birbaşa "ardıcıl təmsil" deməkdir. Biz yaddaşda mürəkkəb, bəlkə də bir-birinə bağlı struktur (obyektlər digər obyektlərə, kolleksiyalara istinad edə bilər və s., bir "obyekt qrafı" yaradır) götürüb onu xətdə, ardıcıl formaya çeviririk, hansı ki yazmaq və ya göndərmək asandır.

2. Niyə sadəcə File.WriteAllText kifayət deyil?

Əla sualdır! Əgər bütün məlumatlar sadə stringlər və ya ədədlərdən ibarət olsaydı, serializasiyaya ehtiyac olmazdı. Amma real həyatda tətbiqlərimiz mürəkkəb modellərlə işləyir: müştərilər, sifarişlər, məhsullar, tələbələr, qəhrəmanlar, level-lər. Hamısı yaddaşda obyektlər kimi təmsil olunur. Və buna görə serializasiya sənin ən yaxşı dostundur:

Tətbiqin vəziyyətinin saxlanması

Təsəvvür et mətn redaktoru yazırsan. İstifadəçi mətn yazır, şriftləri dəyişdirir, şəkillər yerləşdirir. Bütün bu məlumatlar (mətn, ayarlar, kursorun vəziyyəti) əslində proqramındakı obyektlərdir. İstifadəçi "Save" düyməsini basanda, növbəti açılışda hər şey elə olduğu kimi qalsın istəyirsən. Serializasiya bütün lazım olan obyektləri "dondurub" diskə yazmağa imkan verir, sonra yükləyərkən "əski vəziyyətə qaytarır". Bu, videogame-lərdə "save" funksiyası kimidir. İşıq kəsilərsə, leveli yenidən keçmək istəməzsən, düzdür?

Məlumat mübadiləsi tətbiqlər arasında

Sənin C# proqramın bir web-serverlə danışır, server Python-da ola bilər. Və ya mobil app-in (məsələn, Xamarin və ya MAUI üzərində) .NET serveri ilə danışır. Bu proqramların ortaq yaddaşı yoxdur. Məlumat mübadiləsi üçün onlara ortaq, başa düşülən format lazımdır. Serializasiya obyektləri bu ortaq formata (məsələn, JSON və ya XML) çevirir, hansını ki şəbəkə ilə göndərmək olar. Digər tərəfdə qəbul edən tərəf bu məlumatları öz obyektlərinə deserializasiya edir, onlar üçün açıq və başa düşülən. Serializasiya olmasa, hər bir məlumat parçasını əllə "açmaq" və yenidən yığmaq lazım olardı. Bu isə vaxt aparar, yorucu və səhvlərə açıqdır!

Təsəvvür et başqa ölkəyə paket göndərirsən. Eyni cür əşyaları olduğu kimi göndərə bilməzsən; onları beynəlxalq standartlara uyğun qablaşdırmalısan (serializasiya). Qarşı tərəf həmin qabı aça və əşyaları çıxara bilsin (deserializasiya).

Tətbiq konfiqurasiyası

Tez-tez tətbiqlərin bir çox parametrləri olur: pəncərənin ölçüsü, fayl yolları, son açılmış sənədlər, rəng sxemi. Hər bir ayarı ayrı dəyişəndə saxlamaq və sonra əl ilə settings faylına yazmaq (məsələn, .ini və ya .txt) səmərəli deyil. Daha yaxşısı, SettingsApp adlı bir class təyin edib, hər ayarı property şəklində qoymaq və sonra bütün bu object-i serializasiya edib fayla yazmaqdır. Proqram işə düşəndə deserializasiya edirsən. Gözəldir!

Cache (keshləmə) üçün

Bəzən məlumat əldə etmək (məsələn, database-dən və ya uzaq serverdən) çox vaxt ala bilər. Hər dəfə soruşmamaq üçün bir dəfə əldə edib serializasiya edib cache-ə (diskdə və ya xüsusi saxlamada) saxlamaq olar. Növbəti sorğuda əvvəlcə cache-ə baxırsan, əgər məlumat varsa, onu deserializasiya edirsən. Bu tətbiqin işini sürətləndirir və xarici resurslara yükləməni azaldır.

3. Əsas ideya: "vəziyyət"in saxlanması

Serializasiyada ən vacib konsept vəziyyətin saxlanmasıdır. Obyekt özü əslində sahələrinin və onların müəyyən anlı qiymətlərinin cəmlənməsidir. Serializasiya bu vəziyyəti "fotoşəkil" kimi götürür. Deserializasiya edəndə biz sadəcə yeni boş obyekt yaratmırıq, biz onu serializasiya zamanı olan bütün sahə qiymətləri ilə birlikdə bərpa edirik.

Bu, sadə məlumatın surətini çıxarmaq deyil. Bu, strukturun və dəyərlərin dərin surətidir, digər obyektlərə istinadlar da daxil olmaqla, əgər serializer onlarla işləməyi bilirsə. Bəzi serializer-lər hətta obyektin type haqqında məlumat saxlayır, bu da deserializasiya zamanı düzgün class-a qaytarmağa imkan verir, hətta əgər deserializasiya anında dəqiq type-ı əvvəlcədən bilməsək belə.

Klassik nümunə: ev heyvanlarının serializasiyası

Gələn "Ev Heyvanları Ensiklopediyası" tətbiqimizi inkişaf etdiririk. Tutaq ki, bizim belə bir class var:

public class Pet
{
    public string Name { get; set; }
    public string Type { get; set; } // Məsələn: "Kot", "Sobaka"
    public int Age { get; set; }
}

Biz istəyirik:

  • Belə obyektlərdən ibarət kolleksiyanı yaddaşda dolduraq,
  • Onu fayla saxlayıq,
  • Və sonra (məsələn, proqram yenidən başladıqda) bərpa edək.

Sxematik şəkildə belə görünür:


Kolleksiya List<Pet>
    ↓ serializasiya
    Fayl (JSON, XML, baytlar)
    ↓ deserializasiya
Kolleksiya List<Pet> (yenidən yaddaşda!)

4. Hansı serializasiya formatları olur

Daşıma dünyasında müxtəlif konteyner növləri (karton qutular, taxta sandıqlar, metal konteynerlər) olduğu kimi proqramlaşdırmada müxtəlif serializasiya formatları var. Hər birinin öz xüsusiyyətləri, üstünlükləri və çatışmazlıqları var.

Biz hələ dərinliyə getməyəcəyik, amma növbəti mühazirələrdə nə barədə danışılacağını anlamaq üçün bir neçə ad yadda saxlayın:

  • JSON (JavaScript Object Notation): Hal-hazırda bəlkə də ən populyar formatdır. Bu mətn əsaslıdır, insana nisbətən oxunaqlıdır və vebdə məlumat mübadiləsi üçün geniş istifadə olunur. O, "açar-dəyər" cütləri kimi görünür, qıvrım mötərizələr içində. Əslində bu adi mətndir, amma proqramlar üçün parse etmək asandır.
  • XML (Extensible Markup Language): Daha köhnə, amma hələ də geniş istifadə olunan mətn formatıdır. O, HTML kimi taglara əsaslanır və sərt strukturaya malikdir. Korporativ sistemlərdə konfiqurasiya faylları və məlumat mübadiləsi üçün tez-tez istifadə olunur. O da oxunaqlıdır, amma çox vaxt "uzun-uzadı" olur.
  • Binary formatlar: Bu formatlar məlumatı mətn şəklində yox, yaddaşdakı kimi birbaşa baytlar şəklində saxlayır. Onlar adətən daha kompakt və serializasiya/deserializasiya üçün sürətlidir, amma insan üçün oxunmazdır. Onlar performans və fayl ölçüsü vacib olduqda istifadə olunur, məsələn oyun məlumatlarının saxlanması və ya böyük həcmli məlumatların sistem daxilində ötürülməsi üçün.

Format seçimi tapşırığa bağlıdır: insana oxunaqlılıq vacibdirmi? Sürət və ölçü əhəmiyyətlidirmi? Hansı platformalara məlumat ötürülür? Müxtəlif sistemlər arasında məlumat mübadiləsi üçün JSON və XML tez-tez üstün tutulur onların universal olması səbəbindən. Eyni proqram daxilində saxlama üçün isə binary formatlar daha sürətli və effektiv ola bilər.

Gördüyünüz kimi, serializasiya müasir tətbiqlərin əsas alətlərindən biridir. O, proqramlarımıza məlumatı işə salmalar arasında "xatırlamağa", bir-biri ilə danışmağa və mürəkkəb məlumatı effektiv idarə etməyə imkan verir. Növbəti mühazirələrdə biz bu "sehr" haqqında danışmağı dayandırıb, .NET kitabxanalarından istifadə edərək bunu özümüz tətbiq edəcəyik! Hazırlanın, maraqlı olacaq!

2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
Faylın kodlaşdırılmasının konvertasiyası
Faylın kodlaşdırılmasının konvertasiyası
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION