CodeGym /Kurslar /C# SELF /XmlSerializer ilə XML-ə serializasiya üzərində işləmək

XmlSerializer ilə XML-ə serializasiya üzərində işləmək

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

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:

  • [XmlElement]
    — elementi adlandırır.
  • [XmlAttribute]
    — sahəni element deyil, XML atributu edir.
  • [XmlIgnore]
    — xassəni serializasiyadan çıxarır.
  • [XmlArray]
    [XmlArrayItem]
    — kolleksiyaların qablaşdırılmasını idarə edirlər.

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
[XmlAttribute]
Xassəni XML atributuna çevirir
<Player Name="Aragorn">...</Player>
[XmlElement]
Tag adını dəyişir
<HP>100</HP>
əvəzinə
<Health>100</Health>
[XmlIgnore]
Xassəni tamamilə serializasiyadan çıxarır
[XmlArray]
Kolleksiyanın "qabığını" adını dəyişir
<Heroes> ... </Heroes>
[XmlArrayItem]
Kolleksiya elementinin adını dəyişir
<Hero>...</Hero>

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

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION