C# ile Nesneleri Diskte Depolamak

  • 28.07.2016
  • M.Tayyip Yetiş
  • .Net Framework

Merhaba arkadaşlar, makale içeriği için uygun bir başlık bulmaya çalıştım umarım bulduğum şey anlatmaya çalıştığım şeyi ifade etmiştir. Bu konunun gerçekten faydalı ve çoğu algoritma problemini çözeğini düşünüyorum. Makalenin kısa hikayesi işe şöyle; Çalıştığım şirkette sistemin bazı sayfalarının aşırı yavaş çalışmasından dolayı bir iyileştirme çalışması içerisine girdim yavaş çalışma sebebi elbetteki veritabanından karmaşık sorgular ile veri çekilmeye çalışılmasıydı daha korkunç olanı ise bunun her istek (Request) işleminde tekrarlamasıydı. Problemin çözümünü veritabanı tarafında aramanın bir mantığı yoktu çünkü sistemin değiştirilmesi ya da iyileştirilmesi için yeterli zaman yoktu sorunun en kısa ve pratik çözümü Cache sistemi kullanmaktı (alternatif için ziyaret edin). .Net Framework'ün kendi içerisinde barındırdığı bir Cache yapısı zaten var OutputCache ve Data Caching kavramları oldukça kullanışlıdır bunun dışında CacheManager gibi alternatif kütüphaneler de iş görebilir fakat ben sisteme ekstra bir dll import etmek istemedim ve sadece ihtiyacım olan bir şeyi kullanmak istedim en önemli kriter ise verilerin disk üzerinde depolanabilmesiydi yani zaten ağzına kadar dolmuş bir RAM problemimiz olduğu için ona daha fazla yüklenemezdim Disk konusunda bir sıkıntımız yoktu. Kısa ve yüzeysel bir araştırmadan sonra kendim bir şeyler yazıp çizmeye karar verdim.

Algoritmamın anahtar kelimesi "Diskte Depola" olduğu için bir şeyler üretip bunları bir dosyaya yazmam gerekiyordu.  Ben de nesneleri (Object) Serialize edip Binary veriye dönüştürüp dosyaya yazdım. Aşağıdaki örneği inceleyin

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

[Serializable]
class uyeler {
 public int id {  get;  set; }
 public string isim {  get;  set; }
}

protected void Page_Load(object sender, EventArgs e) {
 List < uyeler > uye = new List < uyeler > ();
 uye.Add(new uyeler {  id = 324, isim = "mustafa" });
 uye.Add(new uyeler {  id = 234, isim = "hasan" });
 uye.Add(new uyeler {  id = 65234, isim = "ahmet" });

 //Nesneyi dosyaya yaz
 File.WriteAllBytes(Server.MapPath("cache.txt"), ObjectToByteArray(uye as object));

 //Nesneyi dosyadan oku
 object obj = ByteArrayToObject(File.ReadAllBytes(Server.MapPath("cache.txt")));

}

byte[] ObjectToByteArray(object obj) {
  if (obj == null)  return null;
  BinaryFormatter bf = new BinaryFormatter();
  using(MemoryStream ms = new MemoryStream()) {
   bf.Serialize(ms, obj);
   return ms.ToArray();
  }
 }
 private Object ByteArrayToObject(byte[] arrBytes) {
  MemoryStream memStream = new MemoryStream();
  BinaryFormatter binForm = new BinaryFormatter();
  memStream.Write(arrBytes, 0, arrBytes.Length);
  memStream.Seek(0, SeekOrigin.Begin);
  Object obj = (Object) binForm.Deserialize(memStream);

  return obj;
 }

Veritabanı işlemleri için de bu işlemi yapabilirsiniz. Aşağıda DataTable nesnesi için bir örnek var

protected void Page_Load(object sender, EventArgs e) 
{
  //db örnek bir database nesnesidir
  System.Data.DataTable dt = db.tablogetir("SELECT * FROM uyeler");

  File.WriteAllBytes(Server.MapPath("cache.txt"), ObjectToByteArray(dt as object));

  DataTable obj = ByteArrayToObject(File.ReadAllBytes(Server.MapPath("cache.txt")));
}

Yukarıdaki temel örnekleri kendi iş mantığınıza göre genişletebilir daha işlevsel hale getirebilirsiniz örneğin ben bu mantık ile kendi Cache sistemimi yazmayı düşünüyorum. Eğer tamamlamayı başarabilirsem burada paylaşacağım.

Umarı Faydalı Olmuştur.

Mustafa Tayyip YETİŞ
Yazılım Geliştirme Uzmanı

Yorum Yap