Makale Özeti

Özel Bir Collection makale dizimin 5. makalesi olan bu makalede sizlerle birlikte collectionumuzn nasıl serialize edileceğini ve bu sayede web servisten geçebilir veya Session,Viewstate gibi yapılarda saklanabilir kılınacağını inceleyeceğiz.

Makale

          Merhabalar,

         Özel Bir Collection makale dizimin 5. makalesi olan bu makalede sizlerle birlikte collectionumuzn nasıl serialize edileceğini ve bu sayede web servisten geçebilir veya Session,Viewstate gibi yapılarda saklanabilir kılınacağını inceleyeceğiz. Serileştirme işleminin temeli nesnenin yapısının XML tabanlı bir formata dönüştürülüp string olarak saklanabilmesidir. Daha önceden DataTable'i serileştirmemiz gerekirken Framework 2.0 ile brlikte DataTable Serileştirilebilir bir yapı olarak gelmektedir, bizimde amacımız Collectionumuzu DataTable benzeri bir yapı haline getirmekteydi, Bundan dolayı şimdi Collectionumuzu serileştirme işlemlerini nasıl yapacağımızı inceleyelim.

            public static string ToXml(object objToXml,bool includeNameSpace)
            {
                  StreamWriter stWriter=null;
                  XmlSerializer xmlSerializer;
                  string buffer;
                  try
                  {
                        xmlSerializer = new XmlSerializer(objToXml.GetType());
                        MemoryStream memStream = new MemoryStream();
                        stWriter = new StreamWriter(memStream);
                        if (!includeNameSpace)
                        {
                              System.Xml.Serialization.XmlSerializerNamespaces xs= new XmlSerializerNamespaces();
                              xs.Add("","");
                              xmlSerializer.Serialize(stWriter, objToXml,xs);
                        }
                        else
                        {
                              xmlSerializer.Serialize(stWriter, objToXml);
                        }
                        buffer = Encoding.ASCII.GetString(memStream.GetBuffer());
                  }
                  catch(Exception Ex)
                  {
                        throw Ex;
                  }
                  finally
                  {
                        if(stWriter!=null)
                              stWriter.Close();
                  }
                  return buffer;
            }

          Collection classımız içine tanımladığımız bu Static metod sayesinde collectionumuzu veya herhangi bir nesnemizi XML yapısında bir stringe çevirebiliyor olacağız.Şimdi ise bu metodun yapısını inceleyelim Bizden nesnemizi alan bu metod diğer parametrede ise NameSpacelerin dahil edilip edilemeyeceğine dair bir boolean değişken almaktadır. İlk önce StreamWriter tanımlıyoruz , ardından ise yapmak istediğimiz işlemin temelini sağlayacak olan XmlSerializer tipinden bir değişken tanımlıyoruz, verileri saklayacak string değişkenimizide tanımladıktan sonra esas işlemimizi yapmak üzere try catch bloklarımızı yaratıyoruz. Try Catch blogunun içinde ise XmlSerializer değişkenimize yeni bir XmlSerializer örneğini yaratıyoryuz ve bu işlemi yaparken yapıcı metodunda metodumuza parametre olarak verilen ve serileştirilecek olan nesnenin tipini veriyoruz. Şimdi ise sırada serileştirilmiş nesnemizin serileştirildikten sonra oluşacak string değişkenimizi memory de tutacağımızdan dolayı MemoryStream tanımlıyoruz. ve daha sonra StreamWriter'ın örneğini alırken yapıcı metodda bu MemoryStream'ı veriyoruz. Eğer namespaceler serileştirilmeye dahil edilmeyecekse XmlSerialerNameSpace'i boş tanımlıyoruz ve daha sonrasında yaratmış olduğumuz xmlSerializer'ın Serialize metodu ile verilen nesnemizi StreamWriter örneğimiz üzerine yaratıyoruz. daha sonrasında ise yarattıgımız bu Stream'dan  bufferi okuyarak string değişkenimize atıyoruz ve bu değişkeni kullanıcısya geri döndürüyoruz.

            public static object XmlTo(string xmlString,Type type)
            {
                  XmlSerializer xmlSerializer;
                  MemoryStream memStream=null;
                  try
                  {
                        xmlSerializer = new XmlSerializer(type);
                        byte[] bytes=new byte[xmlString.Length];
                        Encoding.ASCII.GetBytes(xmlString,0,xmlString.Length,bytes,0);
                        memStream = new MemoryStream(bytes);  
                        object objectFromXml= xmlSerializer.Deserialize(memStream);   
                        return objectFromXml;
                  }   
                  catch(Exception Ex)
                  {
                        throw Ex;
                  }
                  finally
                  {    
                        if(memStream!=null)
                              memStream.Close();
                  }   
            }

          Collection classımız içinde tanımladığımız bu static metod sayesinde xml yapısında verilen bir stringi deserialize ederek tekrar nesnemizi elde etmiş olacağız. Diğer metodda olduğu gibi XmlSerializer ve MemoryStream tanımlıyarak metodumuza başlıyoruz. Daha sonra try catch bloklarının içinde XmlSerializer nesnesinin bir örneğini yapıcı metoduna çevirmek istediğimiz tipi esas metodumuzda aldığımız parametrik veri sayesinde veriyoruz. String veri tipinde gelen xml yapısı uzunluğunda bir byte dizisi tanımladıktan sonra stringimizi bu byte dizisine aktarıyoruz vebu byte dizisini ise MemoryStream nesnemizin bir örneğini alırken yapıcı metodda parametre olarak veriyoruz. daha sonra XmlSerializer örneğimizin Deserialize metoduna bu streamı vermek suretiyle nesnemizi elde etmiş oluyor ve kullanıcıya döndürüyoruz.

         Şimdi ise geliştirdiğimiz bu özelliği bir uygulama üzerinde deneyelim. Uygulamamız bir Web Uygulaması olacak ve gelen veri ViewState'de saklanacaktır. Şimdi bu Uygulamadaki PageLoad metodunu inceleyelim.

    protected void Page_Load(object sender, EventArgs e)
    {
            SampleCollection s = new SampleCollection();
            DbProviderFactory ProviderFactory = DbProviderFactories.GetFactory("System.Data.SqlClient");
            DbConnection Connection = ProviderFactory.CreateConnection();
            Connection.ConnectionString = "data source=.;initial catalog=MyCollectionTest;integrated security=SSPI";
            DbCommand cmd = ProviderFactory.CreateCommand();
            cmd.CommandText = "Select TOP 5 * FROM Sample";
            cmd.Connection = Connection;
            DbDataReader dr;
            Connection.Open();
            dr = cmd.ExecuteReader();
            s.SetDataFromReader(dr);
            Connection.Close();
            ViewState.Add("hede", MyCollection<SampleCollection>.ToXml(s,false));           
    }

          Bu metodda yer alan kodlar temel Ado.Net kodlarıdır bu sebepten açıklamaya gerek duymadım. Veriyi Collectionumuza doldurduktan sonra collectionmuzu viewState nesnesinde saklamak için ilk önce serileştirmemiz gerek bunu yaptığımız kod satırı ise bu metodun son satırıdır. Göründüğü gibi MyCollection tipinin static metodlarından ToXml metoduna collectionumuzu veriyoruz ve geriye dönen string'i ise viewstate nesnesinde kolaylıkla saklayabiliyoruz.

          Bu nesneyi ViewState'de sakladıktan sonra gerçekten geriye dönüş yapabildiğini ispatlayabilmek ve görebilmek için Sayfa üzerine bir DataGrid ve bir Button kontrolü koyuyoruz. Button'a tıklandığında ViewState'de bulunan bu veriyi okuyacak ve DataGridde göstereceğiz. Şimdi ise Bu buttonun Click Metodunu inceleyelim.

      protected void Button1_Click(object sender, EventArgs e)
      {
            GridView1.DataSource = MyCollection<SampleCollection>.XmlTo(ViewState["hede"].ToString(), typeof(SampleCollection));
            GridView1.DataBind();
      }

          Bakın ViewStaeden okuduğumuz string 'i MyCollection tipinde bulunan static XmlTo metoduna parametre olarak verip ve diğer parametrede dönüş tipini Collectionumuz cinsinden belirtip bu metodu çağırıyoruz ve verdiğimiz string bize belirttiğimz tipteki bir nesne olarak geriye dönüyor, geriye dönen bu nesneyi DataGridimizin DataSource'una vererek hatasız bir şekilde gösterebiliyoruz. Buda metodlarımızın kusursuz çalıştığının bir ispatı oluyor.

          Hep birlikte kendimize ait bir Collectionumuzu nasıl yazabileceğimizi ve istediğimiz özellikleri nasıl katabileceğimizi incelediğimiz bu makale dizisinde öğrendiğimiz yöntemler ile ufkumuz geniş olduğu kadar kişiselleştirilmiş ve başarılı özellik ve yapıya sahip Collection class'ımızı yazabiliriz. Bu makale dizisinde verilen örnekler öğrenme amaçlı olduğundan hata yakalama kodları yazılmamış ve kod optimizasyonu yapılmamıştır.

oztamer@hotmail.com
tamer.oz@yazgelistir.com
oztamer@hotmail.com
Örnek Kodlar