1. Giriş
Biz «LEGO-fiqurunu hissələrə ayırmaq» qərarı verdikdə, gəlin .NET-də bunun üçün hansı alətlər olduğuna baxaq. Başqa sözlə — obyektləri müxtəlif formatlara serializasiya və deserializasiya etməyə kömək edən standart siniflər hansılardır və hər birinin arxasında nə durur.
.NET serialization ailəsi necə təşkil olunub
Hazırki (2025) məqamda .NET bir neçə əsas yanaşma təklif edir serialization üçün, hər birinin öz sinif və alət dəsti var. Ən əsas və tez-tez rast gəlinənlər:
- JSON-serialization — əsas və ən müasir variant, əksər layihələrdə istifadə olunur.
- XML-serialization — bir az köhnə üslubda, amma hələ də aktiv istifadə olunur.
- Binary serialization — xüsusi hallar üçün, adətən müasir üçüncü tərəf həlləri vasitəsilə.
Çox nümunələr və .NET 9-da kodun böyük hissəsi məhz JSON-dan istifadə edir, bu moda deyil — sənaye standartıdır. Amma .NET başqa yolları da dəstəkləyir — ehtiyac olduqda.
.NET serialization-in əsas qəhrəmanları
| Format | Serialization sinifi | Sadəlik | Performans | Təhlükəsizlik | Müasirlik |
|---|---|---|---|---|---|
| JSON | |
🔥🔥🔥 | 🔥🔥🔥 | 🔥🔥🔥 | Ən müasir |
| XML | |
🔥🔥 | 🔥🔥 | 🔥🔥 | İstifadədədir |
| JSON | Newtonsoft.Json (Json.NET) | 🔥🔥🔥 | 🔥🔥 | 🔥🔥🔥 | Çox populyardır |
Hər biri haqqında qısa
- System.Text.Json: .NET-də yeni JSON serialization standartıdır, .NET Core 3.0-da göründü, .NET 5+ ilə əsas oldu. Tez, yüngül, təhlükəsiz, .NET 9-da “qutudan çıxan” şəkildə yerləşir. Sənədləşmə
- XmlSerializer: XML-ə serialization üçün köhnə və sübut olunmuş variant. İstifadəsi sadədir, amma məhdudiyyətləri var (məsələn, public klass və public xassələr tələb olunur). Uyğunluq və ciddi data kontraktları üçün yaxşıdır. Sənədləşmə
- Newtonsoft.Json: System.Text.Json ortaya çıxana qədər JSON-serialization üçün de-facto standart idi. Çox vaxt mürəkkəb ssenarilər (dinamika, private xassələr və s.) üçün istifadə olunur. Sənədləşmə
BinaryFormatter hara getdi?
Əgər internetdə BinaryFormatter istifadə etməyi məsləhət görən tapırsınızsa — çox güman ki, bu qədim tutorial-dır. BinaryFormatter istifadə etməyin: o .NET 9-dan təhlükəsizlik səbəblərinə görə götürülüb. Müasir binary serialization üçün üçüncü tərəf həlləri — məsələn, Protobuf və ya MessagePack istifadə olunur.
2. Sadə nümunələr
Gəlin praktiki olaraq serialization və deserialization tətbiq edək, tanış olduğumuz oyun dünyasından Player sinifinin nümunəsi üzərində.
Serialization üçün sinifi hazırlayaq
// Player.cs
public class Player
{
public string Name { get; set; }
public int Health { get; set; }
public bool IsAlive { get; set; }
public List<string> Inventory { get; set; }
public Position Position { get; set; }
}
public class Position
{
public int X { get; set; }
public int Y { get; set; }
}
a) System.Text.Json ilə JSON-ə serialization və deserialization
using System.Text.Json;
Player aragorn = new Player
{
Name = "Aragorn",
Health = 100,
IsAlive = true,
Inventory = new List<string> { "sword", "bow", "healing potion" },
Position = new Position { X = 10, Y = 25 }
};
// Player obyektini JSON sətrinə serialize edirik
string json = JsonSerializer.Serialize(aragorn);
// JSON-u ekrana çıxaraq
Console.WriteLine(json);
// JSON sətrini yenidən Player obyektinə deserialize edirik
Player? aragornClone = JsonSerializer.Deserialize<Player>(json);
// Klonun işlədiyini yoxlayaq :)
Console.WriteLine(aragornClone?.Name); // "Aragorn" çap olunmalıdır
Hər şey bu qədər sadədir — heç bir “magik atributlar” və mürəkkəb ayinlər yoxdur. İndi XML-də necə görünür baxaq.
b) XmlSerializer ilə XML-ə serialization və deserialization
using System.Xml.Serialization;
// Player üçün serializer-i qururuq
XmlSerializer serializer = new XmlSerializer(typeof(Player));
// Fayla serialization
using FileStream fs = new FileStream("aragorn.xml", FileMode.Create);
serializer.Serialize(fs, aragorn); // Aragorn-u XML faylına yazırıq
// Fayldan deserialization
using FileStream fs = new FileStream("aragorn.xml", FileMode.Open);
Player aragornFromXml = (Player) serializer.Deserialize(fs)!;
Console.WriteLine(aragornFromXml.Name); // "Aragorn" çap olunmalıdır
Diqqət! XmlSerializer siniflərin və onların xassələrinin public olmasını və boş konstruktorun olmasını tələb edir (əgər konstruktoru override etmisinizsə — ona public və parametrsiz olmasını təmin edin). Əks halda serialization səhvlə bitəcək.
c) Newtonsoft.Json ilə JSON-ə serialization və deserialization
using Newtonsoft.Json; // NuGet vasitəsilə Newtonsoft.Json paketini əlavə etməyi unutmayın!
// Serialization
string json2 = JsonConvert.SerializeObject(aragorn);
// Deserialization
Player? aragornFromNewtonsoft = JsonConvert.DeserializeObject<Player>(json2);
Console.WriteLine(aragornFromNewtonsoft?.Name); // Yenə "Aragorn"
Demək olar eyni görünür, amma Newtonsoft.Json-də çox əlavə opsiyalar var — məsələn, private sahələri serializasiya etmək, formatlaşdırmanı tənzimləmək və mürəkkəb ssenariləri həll etmək.
4. Faydalı incə məqamlar
Standart serializer-lər və onların imkanları
| Sinif | Format | .NET-ə daxil | NuGet paketi lazımdır? | Fayllar üçün yararlıdır | API üçün yararlıdır | Sadəlik |
|---|---|---|---|---|---|---|
|
JSON | Bəli | Xeyr | Bəli | Bəli | Yüngül |
|
JSON | Xeyr | Bəli | Bəli | Bəli | Yüngül |
|
XML | Bəli | Xeyr | Bəli | Tez-tez | Yüngül |
Hansı sinifi istifadə edəcəyinizi necə anlamaq olar?
Əgər XML-ə niyə ehtiyacınız olduğunu bilmirsinizsə — demək olar ki, həmişə JSON və System.Text.Json götürün. Bu daha sürətlidir, daha sadədir və müasir praktikalarla uyğun gəlir.
XML-i seçmək məntiqlidir, əgər:
- Əgər köhnə sistemlərlə inteqrasiya edirsinizsə və onlar məhz XML tələb edirsə.
- Möhkəm sxem və struktura validasiyası lazımdırsa.
- Strukturlar böyük, stabil və formal uyğunluq vacibdirsə (settings, konfiq faylları, enterprise mübadiləsi).
JSON — əgər:
- Müasir tətbiq yaradırsınız, web və mobil ilə əlaqə qurursunuz.
- Sadelik, oxunaqlılıq və kompaktlıq lazımdır.
- Əlavə asılılıqlar çəkmək istəmirsiniz.
Newtonsoft.Json — əgər:
- Private sahələrin serializasiyası, xüsusi customizasiya və tam elastiklik lazımdır.
- Və ya layihə artıq bu kitabxananı miras alıb və migrasiya indi məqsədəuyğun deyil.
5. Tipik səhvlər və tələbatlı məqamlar
Kodlaşdırma. Əsas serializer sinifləri (xüsusən fayllarla işləyərkən) standart UTF-8 istifadə edir. Əgər “simvollar pozulub” görürsünüzsə, faylları necə oxuduğunuzu/yazdığınızı və kodlaşdırmanı yoxlayın. Kodlaşdırma konfiqurasiyası üzrə sənədləşmə.
Dəstəklənməyən tiplər. Bəzi standart serializer-lər (xüsusən XML) məsələn, sözlükləri (Dictionary), private/protected sahələri, event-ləri, delegate-ləri və interfeisləri serializasiya edə bilmirlər. Adətən public sadə xassələr və klasslar dəstəklənir.
Sinif versiyaları. Əgər sinif strukturunu dəyişdirirsinizsə (xassə əlavə/yenidən adlandırma/silmə), köhnə saxlanmış data düzgün oxunmaya və ya səhv deserialization-a səbəb ola bilər. Formatların versionlaşdırılmasını planlaşdırın.
Null-dəyərlər. Deserialization zamanı, əgər məlumatlarda bəzi sahə yoxdursa, uyğun xassə default dəyər alacaq (referans tip üçün — null). Yoxlamaları unutmayın.
Atributlar. Dəqiq tənzimləmə üçün tez-tez [JsonIgnore], [XmlElement] və s. kimi atributlardan istifadə olunur. Bunlar xassələri istisna etməyə, element adlarını dəyişməyə və formatı idarə etməyə imkan verir — detalları növbəti mühazirələrdə.
GO TO FULL VERSION