Merhaba,
Bir önceki C#’ta XmlSerializer Sınıfı İle Serialization ve Deserialization başlıklı yazımda XmlSerializer sınıfı ile serileştirme ve paralelleştirme işlemlerini irdelemiştik. Şimdi ise bu sınıfı Extension metod olarak Generic yapıda kullanmayı göreceğiz.
Aşağıda inşa edilmiş Extension metodu inceleyiniz.
static class Extension
{
static public bool XMLKaydet<T>(this T nesne, string Dizin) where T : class, new()
{
var xml = new XmlSerializer(typeof(T));
using (StreamWriter sw = new StreamWriter(Dizin))
{
xml.Serialize(sw, nesne);
return true;
}
}
static public T XMLYukle<T>(this T nesne, string Dizin) where T : class, new()
{
var xml = new XmlSerializer(typeof(T));
using (StreamReader sr = new StreamReader(Dizin))
{
var gelen = (T)xml.Deserialize(sr);
foreach (var property in nesne.GetType().GetProperties())
{
gelen.GetType().GetProperties().ToList().ForEach(p =>
{
if (p.Name == property.Name)
{
property.SetValue(nesne, p.GetValue(gelen));
}
});
}
return nesne;
}
}
}
Evet, XmlSerializer sınıfını her nesnede kullanabileceğimiz Generic Extension metod yapıları oluşturmuş olduk. XMLYukle metodu içerisinde gelen tipin tüm propertyleri taranmakta ve xml dosyasından elde edilip ilgili tipe cast edilmiş nesnenin denk gelen propertylerine verileri set edilmektedir. Ee artık geri kalan algoritma ve izahı sizlerin emeklerine kalmış.
Örnek olarak aşağıdaki gibi bir kaç sınıf oluşturalım.
public class A
{
public int a1 { get; set; }
public int a2 { get; set; }
}
public class B
{
public int b1 { get; set; }
public int b2 { get; set; }
}
public class C
{
public int c1 { get; set; }
public int c2 { get; set; }
}
Şimdi Generic Extension metodlarımızı yukarıdaki sınıfların nesneleri üzerinde kullanmayı deneyelim.
Gördüğünüz gibi nesnemiz üzerinde Extension metodlara erişebilmekteyiz. Burada sadece A tipinden nesne üzerinde görsel örneklendirme yapılmıştır. Tabi ki de diğer tüm nesnelerde de aynı Extension metodlara erişilebilmektedir.
class Program
{
static void Main(string[] args)
{
A a = new A();
a.a1 = 1;
a.a2 = 2;
a.XMLKaydet(@"D:\XMLA.xml");
B b = new B();
b.b1 = 3;
b.b2 = 4;
b.XMLKaydet(@"D:\XMLB.xml");
C c = new C();
c.c1 = 5;
c.c2 = 6;
c.XMLKaydet(@"D:\XMLC.xml");
}
}
Bu işlem neticesinde “D” dizininde aşağıdaki gibi XML dosyaları oluşturulmuş olacaktır.
İçerikleride aşağıdaki gibi olacaktır.
| A Class | B Class | C Class |
Şimdide diğer Extension metodumuz olan XMLYukle metodunu kullanalım.
class Program
{
static void Main(string[] args)
{
A a = new A();
a.XMLYukle(@"D:\XMLA.xml");
Console.WriteLine($"A -> {a.a1} {a.a2}");
B b = new B();
b.XMLYukle(@"D:\XMLB.xml");
Console.WriteLine($"B -> {b.b1} {b.b2}");
C c = new C();
c.XMLYukle(@"D:\XMLC.xml");
Console.WriteLine($"C -> {c.c1} {c.c2}");
Console.Read();
}
}
Sanırım Generic Extension metodları eşliğinde XmlSerializer sınıfını kullanmanın tadı ayrı bir lezzetli olsa gerek ki ayriyetten yukarıdaki algoritma ile oluşturduğumuz yapı ile XML çalışmalarında mükemmel pratiklik kazanacağımızda şüphesizdir.
Velhasıl okuduğunuz için teşekkür ederim…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
