19 Mart 2015 Perşembe

.Net C# Object Serialization ve Deserialization


Zaman zaman çektiğimiz verilerin xml olarak alınması gerekebilir.Bu durumda yazılımcıların genelde ihtiyacı olan bu işlemi pratik bir şekilde yapabiliriz.Bu işlemi xml yayınlama, nesne listesi olarak aldığımız verilerin xml olarak incelenmesi, vb. gibi süreçleri için kullanabiliriz.


1.Bir nesneyi yada nesne listesini xml dosyası olarak serialize etme işlemi için kullanabileceğimiz metod :

 public bool SerializeObject<T>(T dataList, string filePath)
        {
            bool isSuccess = true;
            try
            {
                string requestString = string.Empty;
                XmlSerializer xmlSerializer = new XmlSerializer(dataList.GetType());
                using (StringWriter writer = new StringWriter())
                {
                    xmlSerializer.Serialize(writer, dataList);
                    requestString = writer.ToString();
                }//End Using

                File.WriteAllText(filePath);
            }
            catch (Exception ex)
            {
                isSuccess = false;
            }

            return isSuccess;

        }//End Method


2.Serialize ettiğimiz bir xml dosyasını deserialize etme işlemi için kullanabileceğimiz metod :

  public List<T> DeserializeObject<T>(string filePath)
        {
            try
            {
                if (!File.Exists(filePath))
                    return default(List<T>);

                string xmlString = File.ReadAllText(filePath);

                using (MemoryStream mStream = new MemoryStream(Encoding.Unicode.GetBytes(xmlString)))
                {
                    mStream.Position = 0;
                    XmlSerializer serializer = new XmlSerializer(typeof(List<T>));
                    return (List<T>)serializer.Deserialize(mStream);

                }
            }
            catch (Exception ex)
            {
                return default(List<T>);
            }

        }//End Class


Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

Gitti Gidiyor API ile Kategori Hiyerarşisini Çekmek


Bu yazımda gitti gidiyor api leri ile kategori verilerini nasıl çekeriz ve gitti gidiyorun algoritması ile bu aldığımız kategori verileri ile nasıl bir kategori hiyerarşisi oluşturabilirz bundan bahsediyor olacağım.

Öncelikle servisleri kullanabilmeniz için dev.gittigidiyor.com üzerinden api bilgilerine sahip olmanız gerekiyor.

Kategorileri Getirme
1.BasicAuthentication işlemi : Bu işlem api bilgileriniz ile servisleri çağırmadan önce yapmanız gereken bir authentication işlemidir.Buradaki veriler gitti gidiyor geliştirici hesabınızda tanımladığınız bilgilerdir.

Aşağıdaki gibi bir metod oluşturarak bu işlemi yapabiliriz.

 public void SetBasicAuthentication(string apiKey, string secretKey, string roleName, string rolePass)
        {          
            /*create authentication*/
            AuthConfig config = new AuthConfig();
            config.ApiKey = apiKey;
            config.SecretKey = secretKey;
            config.RoleName = roleName;
            config.RolePass = rolePass;

            ConfigurationManager.setAuthParameters(config);

        }//End Method


2.Kategori Verilerini Getirme : Gitti gidiyor üzerindeki tüm kategorileri getirme işlemi.Normal şartlarda kategorileri getirmek için tek bir metod kullanmak yetmiyor.Fakat sayfalama tekniği kullanarak bu verileri sayfa sayfa 100 er adet çekebiliyoruz.

Ben bu örneğimde kendim bir class oluşturup bu class üzerinden gidiyor olacağım.Adımlarımız şu şekilde olacak.
1-Hiyerarşik olarak kategori verilerinin tutulacağı bir class oluşturma.
2-Gitti Gidiyor api leri ile tüm kategorileri çekme
3-Alınan kategori verilerinin hiyerarşik olarak düzenlenmesi.


/*1-Hiyerarşik olarak kategori verilerinin tutulacağı bir class oluşturma.*/

public partial class Integration_Category
{
private string ParentID { get; set; };

private string CategoryID { get; set; };

private string CategoryName { get; set; };

private string CategoryPath { get; set; };

private bool IsEnabled { get; set; };
        }//End Class



/*2-Gitti Gidiyor api leri ile tüm kategorileri çekme*/
public List<Integration_Category> GetGittiGidiyorCategories()
        {

            List<Integration_Category> listOfCategories = new List<Integration_Category>();

            /*set properties definitions*/
            bool getDetail = true;
            bool getSubCatDetail = true;
            string lang = "tr";

            int pageSize = 100;
            int pageCount = 1;
            int currentPageCount = 0;
            do
            {

                GittiGidiyor.Category.categoryServiceResponse catList = categoryService.getCategories((currentPageCount * pageSize),
                                                                                               pageSize,
                                                                                               getDetail,
                                                                                               getSubCatDetail,
                                                                                               true, lang);
                if (catList == null)
                    break;

                if (catList.categories == null)
                    break;

                foreach (categoryType category in catList.categories)
                {
                    Integration_Category currentCat = new Integration_Category()
                     { CategoryID = category.categoryCode,
                       CategoryName = category.categoryName,
                       ParentID = ""
                 };
                    listOfCategories.Add(currentCat);
             
                }//End Foreach

                /*pageCount is setted at first loop*/
                if (pageCount == 1)
                {
                    pageCount = (int)Math.Ceiling(catList.categoryCount / 100M);
                }
                currentPageCount++;
            } while (currentPageCount != pageCount);

            /*Kategoria ağacının getirileceği aşağıda yer alan metod*/
            listOfCategories = this.GetCategoryTree(listOfCategories);

            return listOfCategories;

        }//End Method




/*3-Alınan kategori verilerinin hiyerarşik olarak düzenlenmesi.*/
 private List<Integration_Category> GetCategoryTree(List<Integration_Category> tempCategoryList)
        {
            List<Integration_Category> listOfCategory = new List<Integration_Category>();
            foreach (Integration_Category parentCat in tempCategoryList.Where(c => c.CategoryID.Length == 1))
            {
                parentCat.ParentID = null;
                parentCat.IntegrationType = GittiGidiyorSetting.IntegrationType;
                parentCat.IsEnabled = true;
                parentCat.CategoryPath = parentCat.CategoryName;
                listOfCategory.Add(parentCat);
                int level = 1;
                listOfCategory.AddRange(this.GetSubCategoryList(tempCategoryList, parentCat.CategoryPath, parentCat.CategoryID, level + 1));

            }//End Foreach

            return listOfCategory;

        }//End Method

/*alt kategorileri getiren recursive method*/
 private List<Integration_Category> GetSubCategoryList(
                                                           List<Integration_Category> tempCategoryList,
                                                           string categoryPath,
                                                            string parentCategoryCode,
                                                           int level)
        {
            List<Integration_Category> listOfSubCategory = new List<Integration_Category>();

            foreach (Integration_Category subCat in tempCategoryList.Where(c => c.CategoryID.StartsWith(parentCategoryCode) && c.CategoryID.Length == level))
            {
                subCat.IntegrationType = GittiGidiyorSetting.IntegrationType;
                subCat.IsEnabled = true;
                subCat.ParentID = parentCategoryCode;
                subCat.CategoryPath = categoryPath + " / " + subCat.CategoryName;
                listOfSubCategory.Add(subCat);
                listOfSubCategory.AddRange(this.GetSubCategoryList(tempCategoryList, subCat.CategoryPath, subCat.CategoryID, level + 1));

            }//End Foreach

            return listOfSubCategory;

        }//End Method




Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

15 Mart 2015 Pazar

Type 'System.Data.Linq.ChangeTracker+StandardChangeTracker' in Assembly 'System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.


Linq to sql ile çalışırken serialize işlemi yapmaya çalıştığımızda aşağıdaki gibi bir hata alabiliriz.

Serializable Exception :
Type 'System.Data.Linq.ChangeTracker+StandardChangeTracker' in Assembly 'System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.



Bu durumda aşağıdaki işlemi yapmamız yeterlidir.

Örneğin 'TradeDataContext' isminde bir dbml imizin olduğunu düşünelim ve içerisinde Product isminde bir tablodan veri çekmek istediğimizi düşünelim.

Normalde hata alabileceğimiz şekli aşağıdaki gibi bir senaryoda olacaktır.

TradeDataContext context=new TradeDataContext();
context.Products.Tolist();

Bu hatadan geçmek için aşağıdaki şekilde bir ekleme yapıp kodumuzu yeniden düzenlersek sorun çözülmüş olacaktır.

TradeDataContext context=new TradeDataContext();
context.ObjectTrackingEnabled = false;/*kodumuz içerisinde eklenecek kod*/
context.Products.Tolist();

Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.