1. Niyə ümumiyyətlə format seçməlisən? Qısa xatırlatma
Hər hansı .NET obyekti yaddaşda — ünvanlar, istinadlar, sahələr, daxili strukturlar və digər "maşın mətbəxi"dir. Amma bunu fayla belə saxlamaq alınmır: fayllar elə strukturda olmalıdır ki, onları yalnız biz yox, digər proqramlar da oxuya (və yaxşısı odur ki, yaza) bilsin. Məhz burada serializasiya formatının seçimi meydana çıxır.
Serializasiya formatından gözlənilən əsas şeylər:
- Komplektlik: diskdə yer və ya şəbəkə üzərindən ötürmə sürəti.
- Oxunaqlıq (insan üçün!): faylı mətn redaktorunda aça və nə baş verdiyini anlaya bilmək.
- Ümumi istifadə: digər sistemlər və dillərlə inteqrasiya mümkündürmü.
- Mürəkkəb strukturların dəstəyi: nested strukturlar, kolleksiyalar, referanslar, tiplər.
- Təhlükəsizlik və uyğunluq.
2. Binar serializasiya (Binary Serialization)
Binar serializasiya məlumatları "xam" bayt axını kimi təqdim edir. Təsəvvür et, əşyaları sadəcə qutuda yığmamısan, onları sementlə bağlamısan — sürətli, sıx, amma sonra corablarını tapmaq üçün çəkic lazımdır.
// Tarixi nümunə üçün:
using System.Runtime.Serialization.Formatters.Binary;
// ... obyektin yaradılması
var user = new User { Name = "İvan", Age = 42 };
// Serializasiya
using var fs = new FileStream("user.bin", FileMode.Create);
var formatter = new BinaryFormatter();
formatter.Serialize(fs, user);
Üstünlükləri:
- Sıxlıq: diskdə minimum yer tutur, yüksək sürət.
- ".NET"-in yerli tiplərinə daxili dəstək.
Çatışmazlıqları:
- Format tamamilə oxunmazdır — Notepad-da açmağa çalışsanız, Matrix-ə düşəcəksiniz (yəni oxunmaz simvollar dəstəsi əldə edəcəksiniz).
- Tamamilə universallıqdan uzaqdır: yalnız .NET üçün (həm də yalnız həmin versiya üçün!).
- Versiyalar arasında uyğunluq problemlərinə həssasdır.
Harada istifadə olunurdu?
.NET daxilində, eyni maşındakı proseslər arasında obyektləri tez "dump" etmək lazım olanda istifadə olunurdu. İndi isə təhlükəsizlik və uzunmüddətli dəstək vacibdirsə, güclü şəkildə tövsiyə edilmir. Müasir layihələrdə BinaryFormatter-dən istifadə pis praktikadır.
3. XML formatı (Extensible Markup Language)
XML — taglara əsaslanan insan və maşın tərəfindən oxuna bilən formatdur, HTML-ə oxşardır, amma <body> haqda zarafatları yoxdur.
<User>
<Name>İvan</Name>
<Age>42</Age>
</User>
Serializasiyanın nümunəsi:
using System.Xml.Serialization;
var user = new User { Name = "İvan", Age = 42 };
var serializer = new XmlSerializer(typeof(User));
using var fs = new FileStream("user.xml", FileMode.Create);
serializer.Serialize(fs, user);
Üstünlükləri:
- Oxunaqlıq: strukturu gözlə görmək olar.
- Ümumi istifadə: XML-i bir çox dillər və proqramlar oxuya bilir.
- Çevikdir (sxemalar, validasiya, namespace dəstəyi və s.).
- Mürəkkəb strukturlar və nested obyektlər üçün əlverişlidir.
Çatışmazlıqları:
- "Səs-küylü" və ağırdır: çox yer və trafik tələb edir.
- Parse etmək binar formatlardan daha yavaşdır.
- Bəzi tiplərin (məsələn, tarix və zaman) serializasiyasında qeyri-dəqiqlik ola bilər.
- Bəzi kolleksiyalar və ya qeyri-standart obyektlər üçün əlavə konfiqurasiya tələb edir.
Harada tətbiq olunur?
Korporativ sistemlər arasında data mübadiləsi, konfiq faylları, strukturun sərt təsvirinin lazım olduğu inteqrasiyalar üçün.
4. JSON formatı (JavaScript Object Notation)
JSON — kompakt, yüngül, oxunaqlı formatdır, JavaScript dünyasından gəlib və sadəliyi ilə demək olar bütün platformalarda data mübadiləsində fəth edib.
{
"Name": "İvan",
"Age": 42
}
Serializasiyanın nümunəsi:
using System.Text.Json;
var user = new User { Name = "İvan", Age = 42 };
string json = JsonSerializer.Serialize(user);
File.WriteAllText("user.json", json);
Üstünlükləri:
- Çox oxunaqlıdır — həm insan, həm maşın üçün.
- Veb texnologiyaları ilə integrasiyası asandır (API-lər, JavaScript və s.).
- XML-dən daha yığcamdır.
- Müasir kitabxanalarda sürətli serializasiya/deserializasiya (System.Text.Json, Newtonsoft.Json).
Çatışmazlıqları:
- Kommentari dəstəyi yoxdur (sənin JSON-ın özü haqqında zarafat edə bilməz).
- Strukturlarda məhdudiyyətlər: məsələn, obyektlər arasında istinadları və ya qeyri-string açarlı dictionary-ləri serializasiya etmək çətin ola bilər.
- Tarix/zaman formatlarında fərqli implementasiyalar arasında anlaşılmazlıqlar ola bilər.
Harada tətbiq olunur?
Demək olar hər yerdə — müxtəlif platformalar arasında məlumat mübadiləsi: web-servislər, mobil tətbiqlər, REST API-lər və s.
5. CSV (Comma-Separated Values)
CSV — sadə mətn formatıdır, məlumatları cədvəl (sətirlər və sütunlar) kimi saxlayır, sahələr vergül və ya başqa ayrıcı ilə ayrılır.
Name,Age
İvan,42
Olqa,27
CSV-ni əl ilə yazmaq nümunəsi:
// Sadələşdirmək üçün adi StreamWriter vasitəsilə yazırıq
var lines = new List<string>
{
"Name,Age",
"İvan,42",
"Olqa,27"
};
File.WriteAllLines("users.csv", lines);
Üstünlükləri:
- Çoxlu proqramlar tərəfindən dəstəklənir (Excel, Google Docs, DB-lər və s.).
- Cədvəl üçün qısa və rahatdır.
Çatışmazlıqları:
- Nested və mürəkkəb obyektlər üçün yararlı deyil (yalnız "düz" strukturlar).
- Data tipləri haqqında məlumat saxlamır (hər şey string kimi gedir).
- Məlumatlarda vergül, dırnaq və yeni sətir olarsa escape etmək problemləri yarana bilər.
Harada tətbiq olunur?
DB-lər arasında export/import, sadə qeydlərin mübadiləsi, tətbiqlərdən çıxarışlar üçün.
6. Sərt tipli protokollar və formatlar
Protocol Buffers (protobuf) və MessagePack — sxemaya əsaslanan binar serializasiya formatlarıdır ki, serializasiyanı daha sıx və sürətli edir. Onlar məlumat strukturunun əvvəlcədən təsvir olunmuş sxemasını tələb edir.
Protobuf üzrə nümunə (sadələşdirilmiş):
.NET standartına daxil deyil, Google.Protobuf paketi tələb olunur.
message User {
string name = 1;
int32 age = 2;
}
Üstünlükləri:
- Ən yüksək sürət və sıxlıq.
- Kross-platform dəstək (çox dillər protobuf-u dəstəkləyir).
Çatışmazlıqları:
- Öyrənilməsi və konfiqurasiyası daha çətindir.
- Sxemaya görə kodun generasiyasını tələb edir.
- Layihəniz saniyələrdə milyonlarla mesaj ötürməyə yönəlməyibsə, həmişə lazım olmaya bilər.
Harada tətbiq olunur?
Yüksək yüklənən sistemlər, mikroxidmətlər arasında data mübadiləsi, oyunlar, IoT.
7. Faydalı nüanslar
Formatların müqayisə cədvəli
| Format | Oxunaqlıq | Sıxlıq | Ümumi istifadə | Mürəkkəb obyektlər | .NET 9-də standart | Təhlükəsizlik |
|---|---|---|---|---|---|---|
| Binary (.NET) | Xeyr | Bəli | Xeyr | Bəli | Xeyr | Xeyr |
| XML | Bəli | Xeyr | Bəli | Bəli | Bəli | Bəli |
| JSON | Bəli | Bəli | Bəli | Qismən | Bəli | Bəli |
| CSV | Bəli | Bəli | Bəli | Xeyr | Xeyr | Bəli |
| Protobuf | Xeyr | Ən yaxşı | Bəli | Bəli | Xeyr | Bəli |
Öz tətbiqiniz üçün formatı necə seçmək?
Mürəkkəb data strukturlarını saxlayırsınız və insan üçün oxunaqlıq vacibdirsə — XML və ya JSON istifadə edin.
Xidmətlər arasında çoxlu məlumatı tez ötürmək lazımdırsa və siz onları idarə edirsiniz — protobuf və ya MessagePack nəzərdən keçirin.
Excel və ya DB üçün hesabatlar çıxarırsınız — CSV istifadə edin.
Servislər və ya CI/CD üçün konfiq yazırsınız — YAML çox vaxt köməyə gəlir.
Sıxlıq, sürət və obyektlər arasında istinadların dəstəyi kritikdirsə — binar formatlara baxmalısınız, amma təhlükəsizlik və uyğunluq çatışmazlıqlarını unutmayın.
8. Hiyləgər məqamlar və tez-tez verilən səhvlər
Əgər məlumatları "gizlilik" üçün binar formatda saxlamağa qərar verirsinizsə, yadda saxlayın: binar dump təhlükəsizlik demək deyil. Hakerlər yenə də bu axını "ayıda" bilərlər. Lazımdırsa şifrələmə istifadə edin.
Tez-tez rastlanan problem: mətn formatları (XML/JSON/CSV) ilə işləyərkən kodlaşdırmanı unutmaq — UTF-8 istifadə edin. Bütün redaktorlar və sistemlər BOM-u sevmir.
XML köhnə görünsə də, müqavilə əsaslı (contractual) protokollar üçün yaxşıdır — strukturun sərt təsviri (məsələn, XSD sxemaları) vacibdirsə; JSON isə sürətli və çevik mübadilələr üçündür.
Mürəkkəb obyekt kolleksiyalarını serializasiya edərkən bütün formatlar nested və ya rekursiv strukturları düzgün dəstəkləmir. JSON və XML massivlər və siyahılarla yaxşı yoldaşdır, CSV isə yox.
GO TO FULL VERSION