1. Giriş
XML — eXtensible Markup Language-in qısaltmasıdır. Özünüzü çox ciddi və danışqan JSON olaraq təsəvvür edin, hansı ki dəfələrlə təkrarlayır: "mən strukturlaşmışam, inan mənə!". XML — məlumatların taglarla əhatə olunduğu mətn formatıdır:
<Player>
<Name>Aragorn</Name>
<Health>100</Health>
</Player>
Niyə bu gün XML-ə obyektləri serializasiya edirik?
- XML hələ də böyük (tez-tez "legacy") sistemlər arasında inteqrasiya üçün geniş istifadə olunur, burada təkcə struktur yox, həm də ciddi sxemalara (XSD) uyğunluq tələb olunur.
- XML çox vaxt korporativ konfiqurasiyalarda istifadə olunur (məsələn, App.config və Web.config .NET-in köhnə nəsillərində).
- XML "özü haqqında məlumat verən" məlumat strukturları tələb olunan tapşırıqlara yaxşı uyğundur.
Maraqlı fakt: XML əvvəldən mümkün qədər "genişlənə bilən" və validasiya edilə bilən olmaq üçün dizayn olunmuşdu; adından da göründüyü kimi. Onu sxemaya görə yoxlamaq olar, bunu JSON standart olaraq təklif etmir.
XmlSerializer: əsas qəhrəman
.NET-də obyektləri XML-ə serializasiya edən klass System.Xml.Serialization.XmlSerializer-dır.
- O, obyektin public xassə və sahələrini XML elementlərinə çevirir və əksinə: XML-dən obyekt yaradır.
- Yalnız açıq tiplər və klass üzvləri ilə işləyir.
- Private sahələri və xassələri serializasiya etmir — yalnız public olanları!
- Serializasiya olunan klass üçün boş (parameter-siz) konstruktorun olması tələb olunur.
Dikkat edin: Əgər sizin klass bu tələblərə cavab vermirsə, XmlSerializer onunla işləyə bilməyəcək — serializasiya və ya deserializasiya mərhələsində exception atacaq.
2. Sadə nümunə — obyektin XML-ə serializasiyası
Gəlin sevimli Player klassımızı XML-ə necə serializasiya edəcəyimizi nəzərdən keçirək.
Addım 1. Klassa təsvir veririk
public class Player
{
public string Name { get; set; }
public int Health { get; set; }
public bool IsAlive { get; set; }
// Vacib: parametr-siz public konstruktor olmalıdır!
public Player() { }
// İstəyə bağlı: rahatlıq üçün
public Player(string name, int health, bool isAlive)
{
Name = name;
Health = health;
IsAlive = isAlive;
}
}
Addım 2. Fayla serializasiya edirik
using System.Xml.Serialization;
Player aragorn = new Player("Aragorn", 100, true);
// 1. Player tipi üçün serializer yaradırıq
XmlSerializer serializer = new XmlSerializer(typeof(Player));
// 2. Yazmaq üçün faylı açırıq (mövcud deyilsə yaradılacaq)
using FileStream fs = new FileStream("player.xml", FileMode.Create);
// 3. Obyekti XML-ə serializasiya edirik
serializer.Serialize(fs, aragorn);
Nəticə (player.xml):
<?xml version="1.0"?>
<Player xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>Aragorn</Name>
<Health>100</Health>
<IsAlive>true</IsAlive>
</Player>
Ən sadə prosesin vizual sxemi
Obyekt yaddaşda ---> XmlSerializer.Serialize() ---> Diskdə XML-fayl
3. Deserializasiya — XML-dən obyekti "canlandırmaq"
Əvvəl serializasiya edilmiş obyekt oxunmalı olduqda, proses əksinədir:
using FileStream fs = new FileStream("player.xml", FileMode.Open);
XmlSerializer serializer = new XmlSerializer(typeof(Player));
Player player = (Player)serializer.Deserialize(fs);
Console.WriteLine($"İsim: {player.Name}, Sağlamlıq: {player.Health}, Canlı: {player.IsAlive}");
Nəticədə proqram belə yazacaq: İsim: Aragorn, Sağlamlıq: 100, Canlı: True
4. Sətirə serializasiya — yalnız fayla yox
Sətirə serializasiya
Həmişə obyektləri fayla serializasiya etmək istəməyə bilərik. Bəzən, məsələn, XML-i şəbəkə ilə string kimi göndərmək və ya ekranda göstərmək lazım gəlir.
using System.IO;
using System.Xml.Serialization;
Player player = new Player("Frodo", 42, true);
XmlSerializer serializer = new XmlSerializer(typeof(Player));
StringWriter stringWriter = new StringWriter();
serializer.Serialize(stringWriter, player);
string xmlString = stringWriter.ToString();
Console.WriteLine(xmlString); // Bütün XML sətrini ekrana çıxarırıq!
Sətirdən deserializasiya
Oxşar şəkildə obyekt fayldan yox, sətrdən deserializasiya edilə bilər:
string xml = "<Player Name=\"Frodo\"><HP>42</HP></Player>";
XmlSerializer serializer = new XmlSerializer(typeof(Player));
using StringReader stringReader = new StringReader(xml);
Player frodo = (Player)serializer.Deserialize(stringReader);
Console.WriteLine(frodo.Name); // Frodo
5. XML-in özəlləşdirilməsi: strukturun idarə olunması üçün atributlar
Bəzən standart davranış sizi qane etmir. XML çox sözlü olur və ya tag-lar hədəflə uyuşmur. Bu halda müxtəlif "sehrli" atributlar köməyə gəlir — onlar serializer-ə klass üzvlərini necə göstərməsini açıq bildirirlər.
Ən faydalılar:
— elementi adlandırır.[XmlElement]
— sahəni element deyil, XML atributu edir.[XmlAttribute]
— xassəni serializasiyadan çıxarır.[XmlIgnore]
və[XmlArray]
— kolleksiyaların qablaşdırılmasını idarə edirlər.[XmlArrayItem]
Nümunə istifadəsi:
public class Player
{
[XmlAttribute]
public string Name { get; set; }
[XmlElement("HP")]
public int Health { get; set; }
[XmlIgnore]
public bool IsTempSessionPlayer { get; set; }
}
Nəticədə alınan XML:
<Player Name="Aragorn">
<HP>100</HP>
</Player>
Serializasiya üçün əsas atributların cədvəli
| Atribut | Nəyə təsir edir | İstifadə nümunəsi |
|---|---|---|
|
Xassəni XML atributuna çevirir | |
|
Tag adını dəyişir | əvəzinə |
|
Xassəni tamamilə serializasiyadan çıxarır | — |
|
Kolleksiyanın "qabığını" adını dəyişir | |
|
Kolleksiya elementinin adını dəyişir | |
Kolleksiyanın mürəkkəb serializasiyasına nümunə:
public class GameWorld
{
[XmlArray("Heroes")]
[XmlArrayItem("Hero")]
public List<Player> Players { get; set; } = new List<Player>();
}
XML:
<GameWorld>
<Heroes>
<Hero Name="Legolas">
<HP>90</HP>
</Hero>
<!-- ... -->
</Heroes>
</GameWorld>
XML-in özəlləşdirilməsi barədə daha ətraflı məlumatı növbəti mühazirələrdə öyrənəcəksiniz! :P
GO TO FULL VERSION