1. Giriş
Xatırlatma: Serializasiya — obyektin vəziyyətini sətir, fayl və ya stream şəklində saxlamağın yolu, beləliklə sonra həmin obyekt bərpa edilə bilər (deserializasiya) — və siz yenidən eyni məlumatlara malik obyekt əldə edirsiniz.
Tipik həyat vəziyyəti:
1) Sizdə məsələn, ad və yaşı olan bir istifadəçi obyekti var.
2) Bunu saxlamaq lazımdır — şəbəkə üzərindən göndərmək, fayla yazmaq və ya məsələn JSON formatında saxlamaq.
3) Sonra sətirdən/fayldan məlumatı çıxarırsınız — və yenidən obyekt əldə edirsiniz!
C#-da bu bir neçə sətrdə edilir. Gəlin dəqiq necə olduğunu baxaq.
Bizim tətbiq
Biz kiçik "Kontakt meneceri" tətbiqi hazırlayırıq. Tutaq ki, serializasiya etmək istədiyimiz Person sinfi var.
public class Person
{
// Açıq (public) property-lər serializasiya üçün vacibdir!
public string Name { get; set; }
public int Age { get; set; }
// XmlSerializer üçün parametrsiz konstruktor tələb olunur
public Person() { }
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
Əgər belə sintaksislə tanış deyilsinizsə, narahat olmayın — kursda siniflər və property-lər ətraflı izah ediləcək. İndilikdə bunu eksperiment üçün məlumat modeli kimi qəbul edin. Nəzərə alın: açıq property-lər Name və Age serializasiya üçün vacibdir, və XmlSerializer üçün parametrsiz açıq konstruktor tələb olunur.
2. System.Text.Json ilə JSON-a serializasiya
Ən sadə nümunə
Vəd edilmişdik — göstəririk! JSON-a serializasiya belə görünür:
using System;
using System.Text.Json;
Person person = new Person("Alisa", 28);
// Serializasiya: obyektin JSON-sətirə çevrilməsi
string json = JsonSerializer.Serialize(person);
Console.WriteLine("JSON:");
Console.WriteLine(json);
Ekranda nə görünəcək?
JSON:
{"Name":"Alisa","Age":28}
Hər şey sadədir: obyekt → JSON. Budur, sehr!
Deserializasiya — hər şeyi geri qaytarmaq
İndi əks əməliyyatı edək — JSON-sətirdən obyekti bərpa edək:
string json = "{\"Name\":\"Bob\",\"Age\":35}";
// Deserializasiya: JSON-sətirdən Person tipli obyektin bərpası
Person restored = JsonSerializer.Deserialize<Person>(json);
Console.WriteLine("Bərpa edilmiş obyekt:");
Console.WriteLine($"Ad: {restored.Name}, yaş: {restored.Age}");
Nəticə:
Bərpa edilmiş obyekt:
Ad: Bob, yaş: 35
Nəzərə alın: əgər məlumat strukturu uyğun gəlmirsə (məsələn, belə property yoxdursa), müvafiq sahə defolt dəyərdə qalacaq (null referans tipləri üçün, 0 ədədlər üçün və s.).
3. XmlSerializer ilə XML-ə serializasiya/deserializasiya
XML-ə serializasiyaya ilk baxış
using System;
using System.IO;
using System.Xml.Serialization;
Person person = new Person("Katya", 22);
// Person tipi üçün serializer yaradırıq
var serializer = new XmlSerializer(typeof(Person));
// XML-i fayla yazırıq
using (var stream = new FileStream("person.xml", FileMode.Create))
{
serializer.Serialize(stream, person);
// Stream using-blokunun sonunda avtomatik bağlanacaq
}
Console.WriteLine("XML-fayl yaradıldı!");
Faylda person.xml təxminən belə bir məzmun olacaq:
<?xml version="1.0"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>Katya</Name>
<Age>22</Age>
</Person>
Vacib məqam:
Fayla serializasiya etmək üçün stream (məsələn, FileStream) istifadə olunur. Əgər sətirə serializasiya etmək istəyirsinizsə (məsələn, şəbəkəyə göndərmək üçün), StringWriter istifadə edin:
var serializer = new XmlSerializer(typeof(Person));
using (var sw = new StringWriter())
{
serializer.Serialize(sw, person);
string xmlString = sw.ToString();
Console.WriteLine(xmlString);
}
XML-dən deserializasiya
using (var stream = new FileStream("person.xml", FileMode.Open))
{
// Lazımi tipə cast etməyi unutmayın!
Person restored = (Person)serializer.Deserialize(stream);
Console.WriteLine($"Ad: {restored.Name}, yaş: {restored.Age}");
}
Bir daha: XmlSerializer serializasiya olunan sinifdə parametrsiz açıq konstruktorun olmasını tələb edir.
4. Fayllarla və sətrlərlə işləmək: nə seçək?
Real həyatda serializasiya birbaşa sətirə (şəbəkəyə ötürmək/DB-də saxlamaq üçün) və ya fayla (uzunmüddətli saxlama üçün) gedə bilər.
Sətirə serializasiya (məsələn API vasitəsilə göndərmək üçün):
- JSON: JsonSerializer.Serialize(obj) istifadə olunur.
- XML: StringWriter vasitəsilə.
Fayla serializasiya (məsələn, eksport/backup üçün):
- JSON: sətiri adi fayl yazma vasitələri ilə saxlayın.
- XML: birbaşa stream-ə yazın XmlSerializer ilə.
Nümunə: fayla serializasiya və geri (JSON)
using System.IO;
using System.Text.Json;
Person person = new Person("Tom", 42);
// Sətirə serializasiya
string json = JsonSerializer.Serialize(person);
// Fayla yazma
File.WriteAllText("contact.json", json);
// Fayldan oxuma
string readJson = File.ReadAllText("contact.json");
Person restored = JsonSerializer.Deserialize<Person>(readJson);
Console.WriteLine($"{restored.Name}, yaş: {restored.Age}");
5. JSON vs XML müqayisəsi
Prosesin vizuallaşdırılması
Çaşqınlıq olmaması üçün serializasiya və deserializasiya prosesinin sxemi:
flowchart LR
A[Obyekt] -- serializasiya --> B[Sətir/Fayl/Stream]
B -- deserializasiya --> C[Obyekt]
A -. JSON və ya XML .-> B
B -. JSON və ya XML .-> C
Serializasiyanı "çamadanı qablaşdırmaq", deserializasiyanı isə "evdə açmaq" kimi təsəvvür edə bilərsiniz.
Müqayisə cədvəli
| Funksionallıq | JSON (System.Text.Json) | XML (XmlSerializer) |
|---|---|---|
| Oxuma/yazma sətirə | ++ | + |
| Oxuma/yazma fayla | ++ | ++ |
| Parametrsiz konstruktor tələb edir | Yox | Bəli |
| İnsan üçün oxunaqlılıq | ++ | + |
| Sərt məlumat sxemi (validation) | - | ++ |
| Fərdiləşdirmə atributları üzrə çeviklik | + | ++ |
| Performans | ++ | + |
| İnternetlə uyğunluq | ++ | + |
++ — çox yaxşı, + — normal, - — dəstəklənmir
6. Serializasiyanı tətbiqimizə necə əlavə etmək
Tutaq ki, "Kontakt menecer"ə istifadəçi kontakt siyahısını fayla saxlamaq və bərpa etmək funksiyası əlavə etmək lazım oldu.
Kontekst: bizim kontakt siyahımız var (List<Person>).
List<Person> contacts = new List<Person>
{
new Person("Vasya", 30),
new Person("Petya", 25),
new Person("Masha", 27)
};
// Bütün kontaktları saxlayırıq — JSON-a serializasiya edirik
string jsonContacts = JsonSerializer.Serialize(contacts);
File.WriteAllText("contacts.json", jsonContacts);
// Kontakt siyahısını bərpa edirik
string readContactsJson = File.ReadAllText("contacts.json");
List<Person> restored = JsonSerializer.Deserialize<List<Person>>(readContactsJson);
foreach (var c in restored)
{
Console.WriteLine($"{c.Name}, yaş: {c.Age}");
}
Eyni şeyi XML ilə də etmək olar, amma orada öz xüsusiyyətləri var. XmlSerializer ilə kolleksiyaları serializasiya edərkən adətən siyahını ayrıca konteyner sinfi ilə (root elementi) bükürlər — bu formatı və element adlarını idarə etməyi asanlaşdırır.
7. Serializasiya və deserializasiyada tipik səhvlər
Səhv №1: serializasiya və deserializasiyada tiplərin uyğun gəlməməsi.
List<Person> serializasiya etmisinizsə — deserializasiya da mütləq List<Person> tipinə olmalıdır, List<object> və ya IEnumerable<Person> kimi yox. Əks halda səhv və ya gözlənilməz nəticə alacaqsınız.
Səhv №2: qeyri-açıq (non-public) field və property-ləri serializasiya etməyə çalışmaq.
Tipik serializer-lər (JsonSerializer, XmlSerializer) açıq üzvlərlə işləyir. Əgər property-də açıq getter/setter yoxdursa, dəyər JSON/XML-ə düşməyə bilər və siz niyə orada null olduğunu axtaracaqsınız.
Səhv №3: parametrsiz konstruktorun olmaması.
XmlSerializer üçün parametrsiz açıq konstruktor vacibdir. Əgər o yoxdursa — deserializasiya zamanı exception alınacaq.
Səhv №4: obyekt istinadlarının yanlış anlaşılması.
Əgər bir obyekt başqa obyektə istinad edirsə, serializasiya "dəyər üzrə" (nested object) gedir. İstinadlar özləri saxlanmır, bu isə məlumatların duplicasiyası və ya dövri (cyclic) istinadlarla problemlərə səbəb ola bilər.
Səhv №5: serializasiya formatlarını qarışdırmağa çalışmaq.
XML və JSON fərqli formatlar və serializer-lərdir. JSON-sətiri XmlSerializer-ə ötürə bilməzsiniz və əksinə — səhv alınacaq.
GO TO FULL VERSION