Serialization و Deserialization در#C

سه شنبه 12 مرداد 1395

در این مقاله شما در مورد Serialization و DeSerialization در #C مطالبی را خواهید آموخت . همچنین در این مقاله با BinaryFormat و XMLFormat آشنا می شویم .

Serialization و Deserialization در#C

Serialization چیست ؟

Serialization ،  فرآیند آوردن  شئ به یک فرم است که این شئ میتواند روی یک رشته (Stream) نوشته شده باشد .  یک فرآیند تبدیل شئ به یک فرم است بنابراین آن میتواند روی یک فایل ، پایگاه داده یا حافظه  ذخیره شده باشد ، این قابلیت رو دارد که از طریق شبکه منتقل و جا به جا شود . هدف اصلی آن ذخیره سازی وضعیت شئ است بنابراین زمانی که نیاز باشد میتواند دوباره ساخته شود .



Deserialization چیست ؟

همانطور که از نام آن پیدا است ، Deserialization برعکس فرآیند Serialization است . فرآیند برگرداندن فایل های Serialized است بنابراین میتواند توی حافظه بارگذاری شود . تنظیم خصوصیات شئ ، آن را دوباره بازسازی میکند و غیره .

انواع : 

• Binary Serialization
• XML Serrialization
• JSON serialization

مثال :
در اینجا مثالی مطرح خواهیم کرد که چگونگی Serialization و Deserialization یک شئ را با استفاده از فرمت Binary و فرمت XML نشان میدهد .

یک پروژه Windows Form Application بسازید و همانند تصویر زیر تعدادی کنترل به آن اضافه کنید  :



حالا کلاسی با نام Employee میسازیم :


using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
  
namespace WindowsFormsApplication1  
{  
    [Serializable]  
    public class Employee  
    {  
        private string Name;  
  
        public string name  
        {  
            get  
            {  
                return Name;  
            }  
  
            set  
            {  
                Name = value;  
            }  
        }  
  
        private string Phone;  
  
        public string phone  
        {  
            get  
            {  
                return Phone;  
            }  
  
            set  
            {  
                Phone = value;  
            }  
        }  
  
        private DateTime DoB;  
  
        public DateTime dob  
        {  
            get  
            {  
                return DoB;  
            }  
  
            set  
            {  
                DoB = value;  
            }  
        }  
  
        private string Department;  
  
        public string department  
        {  
            get  
            {  
                return Department;  
            }  
  
            set  
            {  
                Department = value;  
            }  
        }  
          
        private int Salary;  
  
        public int salary  
        {  
            get  
            {  
                return Salary;  
            }  
  
            set  
            {  
                Salary = value;  
            }  
        }  
  
        [NonSerialized]  
        public string additionalInfo;  
    }  
} 


 [Serialization ] را در بالای کلاس قرار می دهیم . برای آن صفاتی که شما قصد Serialize کردن آنها رو ندارید ،  [NonSerialization] را بالای آنها قرار می دهیم .  
یک event برای دکمه Serilize اضافه کنید . هدف از این کار این است که وقتی ما بر روی دکمه Serialize کلیک می کنیم شئ های کلاس Employee  را  Serialize کند و در فایلی با نام Employee.binary ذخیره شوند . 

private void Serialize_Click(object sender, EventArgs e)  
{  
    Employee emp = new Employee {  
        name = textBoxName.Text,  
        phone = textBoxPhone.Text,  
        dob = dateTimePickerDoB.Value,  
        department = textBoxDepartment.Text,  
        salary = Convert.ToInt32(textBoxSalary.Text),  
        additionalInfo = "We don't want it to serialize"  
    };  
  
    BinaryFormatter bf = new BinaryFormatter();  
  
    FileStream fsout = new FileStream("employee.binary", FileMode.Create, FileAccess.Write, FileShare.None);  
    try  
    {  
        using (fsout)  
        {  
            bf.Serialize(fsout, emp);  
            label6.Text = "Object Serialized";  
        }  
    }  
    catch  
    {  
        label6.Text = "An error has occured";  
    }  
} 


از BinaryFormatter برای Serialized کردن شئ با BinaryFormat استفاده می کنیم  . با استفاده از FileStream  یک فایل با نام Employee.binary بسازید . درون این فایل شئ Serilize شده ما ذخیره می شود.
bf.Serialize(fsout,emp  شئ emp را serialize  و آن را درون employee.binary ذخیره 
خواهد کرد .
مرحله بعدی نوشتن کد برای Deserialize کردن شئ است . یک event برای دکمه Deserialize اضافه کنید .هدف از این کار این است که بعد از کلیک کردن بر روی دکمه ، شئ ما Desrialize و بر روی صفحه نمایش داده شود .

private void Deserialize_Click(object sender, EventArgs e)  
{  
    Employee emp = new Employee();  
  
    BinaryFormatter bf = new BinaryFormatter();  
  
    FileStream fsin = new FileStream("employee.binary", FileMode.Open, FileAccess.Read, FileShare.None);  
    try  
    {  
        using (fsin)  
        {  
            emp = (Employee) bf.Deserialize(fsin);  
            label6.Text = "Object Deserialized";  
  
            textBoxName.Text = emp.name;  
            textBoxPhone.Text = emp.phone;  
            dateTimePickerDoB.Value = emp.dob;  
            textBoxDepartment.Text = emp.department;  
            textBoxSalary.Text = emp.salary.ToString();  
        }  
    }  
    catch  
    {  
        label6.Text = "An error has occured";  
    }  
} 

از BinaryFormatter برای Deserialize کردن شئ درون فایل employee.binary استفاده کنید . بعد از اینکه شئ Deserialized شد ، مقادیر TextBoxها را آپدیت می کنیم .

حالا اجازه دهید برنامه را اجرا کنیم و مقدار دهی کنیم ، مقادیر textBoxهای ما همانند زیر میشود :

 



بر روی Serialize کلیک می کنیم : 



پیام ، نشان میدهد که فایل ما Serialize شده ، برای اطمینان از این امر آدرس زیر را چک میکنیم 

WindowsFormsApplication\WindowsFormsApplication\bin\Debug\employee.binary

در اینجا شما فایل را پیدا خواهید کرد :



حالا برای Deserialize کردن فایل ، مقادیر TextBox ها را پاک کرده و تاریخ را نیز تغییر می دهیم :
 


بر روی Deserialize کلیک کنید ، مقادیر زیر را دریافت خواهید کرد :



Serialize کردن شی در فرمت XML ،
برای این کار به جای استفاده از BinaryFormatter از XmlSerializer  استفاده میکنیم :

XmlSerializer xs = new XmlSerializer(typeof(Employee)); 

 نام فایل را از employee.binary به employee.xml تغییر دهید ،
و به جای [Nonserialized]  از [Xmlgnore] استفاده کنید ، بقیه کد ها مشابه یکدیگر هستند .

آموزش سی شارپ

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 7k بازدید
  • 8 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید