PDA

View Full Version : مقاله : کد کردن فایلها با استفاده از serialization



hamidreza20
شنبه 26 دی 1388, 14:11 عصر
Serialize و Deserialize

در این مقاله سعی می کنیم که یکی از اصلی ترین روش های ذخیره و بازیابی داده ها را معرفی کنیم .آیا تا به حال یک سیب زمینی را درون ماکروفر قرار داده اید تا پخته شود و آیا تا به حال یک سیب زمینی پخته را درون دستگاه دیگری قرار داده اید تا همان سیب زمین اول شود.
مثلماً پاسخ شما برای آیای اول مثبت و پاسخ شما برای آیای دوم یک نگاه معنی دار خواهد بود!
کار اول یعنی پختن سیب زمینی معادل عمل Serialize نمودن داده ها و کار دوم معادل Desterilize نمودن داده ها در .NET Framework می باشد.
با Serialize نمودن داده ها می توانیم آنها را در مکان های مانند فایل ، جداول پایگاه داده و یا memory buffer نگه داری کنیم و با Desterilize نمودن آنها می توانید داده ها را از مکانهای ذکر شده فراخوانی نماییم.
اگر بخواهیم مثالی برای Serialize و Desterilize داده ها بزنیم می توانید به ذخیره شدن یک فایل text از notepad و بازخوانی آن از دیسک برای نمایش مجدد اشاره نماییم، که کاملاً مشابه با فرایند Serialize و Deserialize داده ها می باشد.
از نمونه استفاده های دیگر این فرایند می توانم به موارد زیر اشاره نمایم.
1- نگه داری وضعیت یک نرم افزار (Application State Saving)
2- Copy & Paste
3- Clone Object کپی آبجکت
4- Share Object over network ارسال اطلاعات در شبکه
5- Encrypt compress objectرمز نگاری و رمز گشایی اطلاعات

Serialize: فرآیندی برای تبدیل یک آبجکت و یا گرافی متشکل از چند آبجکت به یک حالت خطی (و جریان وار) از بایت ها برای انتقال و یا ذخیره سازی در محلی دیگر است.
Deserialize : عمل برعکس سریالیزشین است؛ یعنی دوباره ساختن آبجکت از روی جریانی از بایتها .

انواع فرمت ها در سریالیزشین :
1- Binary : بصورت باینری سریالایز میکند. (فشرده ترین و efficient ترین حالت است)
SOAP -2 : بصورت soap سریالایز میکند. (برای ارسال در شبکه و جایی که از تحت دات نت بودن کلاینتها مطمئن نیستیم)
XML -3 : بصورت xml سریالایز میکند. (برای ارسال تحت شبکه - مزیت : خوانایی)

برخی از موارد کاربرد سریالزیشین:
1- کپی یک انشعاب از آبجکتها
2- انتقال اطلاعات در شبکه
3- نگهداری state ها و snapshot های مختلف در یک برنامه (برای موارد حساس : مثل تراکنشهای بانکی و ...)
4- پیاده سازی Deep Copy و Shallow Copy

برای استفاده از Serialize می بایست Namespace


using System.Runtime.Serialization.Formatters.Binary;

، و برای کار با فایل از Namespace ،System.IO در پروژه استفاده می نماییم.

در پروژه مان می خواهیم طول و عرض فرممان را در هنگام بستن فرم Serialize نماییم و در هنگام باز شدن مجدد فرم آنها را Deserialize و استفاده نماییم.
در رویداد FormClosing کد زیر را می نویسیم


private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
ArrayList arr = new ArrayList();
arr.Add(this.Width);
arr.Add(this.Height);
FileStream fs = new FileStream("C:\\Test.dat", FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, arr);

}
در این قطعه کد با قرار دادن عرض و ارتفاع فرم در یک ArrayList و ایجاد یک فایل به نام Test.dat توسط شی BinaryFormatter شی arraylist را در فایل Serialize می نماییم.
حال برای Deserialize اطلاعات قطعه کد زیر را در رویداد Load فرم می نویسم، دقت شود که قرار دادن کد در try catch به منظور جلوگیری از رویداد خطا در هنگام load اول فرم و عدم وجود فایل test.dat می باشد.


private void Form1_Load(object sender, EventArgs e)
{
try
{
using (FileStream fs = new FileStream("C:\\Test.dat", FileMode.Open))
{
BinaryFormatter bf = new BinaryFormatter();
ArrayList ar = (ArrayList)bf.Deserialize(fs);
this.Width = (int)ar[0];
this.Height = (int)ar[1];
}
}
catch { }
}
حال با اجرا فرم و تغییر سایز آن در صورتی که فرم را دوباره باز نماییم سایز آن به میزان سایز فرم قبل از بسته شدن خواهد بود.

التماس دعا...

اگه مفید بود خواستید تشکر بزنید...

hamidreza20
یک شنبه 27 دی 1388, 18:56 عصر
دوستان مقاله فوق خیلی مفیده یه تست بکنید بد نیست. منم از یکی از دوستام گرفتم و انجام دادم برای یه پروژه که می خواستیم اطلاعات سرور رو از یه فایل بخونه و فایل کد بشه اون بخونه. البته من یه برنامه نویس بسیار مبتدی هستم و فقط علاقه دارم...

التماس دعا...

mojdeh6583
سه شنبه 01 تیر 1389, 17:31 عصر
دوستان مقاله فوق خیلی مفیده یه تست بکنید بد نیست. منم از یکی از دوستام گرفتم و انجام دادم برای یه پروژه که می خواستیم اطلاعات سرور رو از یه فایل بخونه و فایل کد بشه اون بخونه. البته من یه برنامه نویس بسیار مبتدی هستم و فقط علاقه دارم...

التماس دعا...

من از مقاله ی فوق هیچیییی نفهمیدم
فکرم نمی کنم که شما مبتدی باشید
و اگه نیستید و به مبتدی هایی مثل من که جون می کنن تا بفهمن این مقاله یعنی چی احترام میگذارید لطفا یه جوری مبتدیانه توضیح بدید این مقاله برای چیه و چیکارش کنم.
مرسی
از طرف یه واقعا مبتدی

cardano7
سه شنبه 01 تیر 1389, 17:42 عصر
سلام
منظورتون از کد کردن که رمزگراری نیست. هست؟
چون هیچ کونه کدگزاری به این مفهوم در اون ندیدم.

s.khoshfekran
سه شنبه 01 تیر 1389, 18:01 عصر
سریالیز کردن هیچ ربطی به کد کردن نداره !!
ولی من یه dll گذاشتم تو این قسمت که شما میتونین با استفاده از الگوریتم rijndael یک ابجکت رو سریالیز کنین!!
http://www.barnamenevis.org/forum/showthread.php?t=64210&page=51

homan1374
چهارشنبه 02 تیر 1389, 08:45 صبح
با سپاس از دوست گرامی که این مقاله رو گذاشتن
این serialization کردن هم عجب چیز جالبیه!!!

mojdeh6583
چهارشنبه 02 تیر 1389, 09:21 صبح
سریالیز کردن هیچ ربطی به کد کردن نداره !!
ولی من یه dll گذاشتم تو این قسمت که شما میتونین با استفاده از الگوریتم rijndael یک ابجکت رو سریالیز کنین!!
http://www.barnamenevis.org/forum/showthread.php?t=64210&page=51

خوب شما یه توضیح بدید که سریالیز کردن چیه؟

kahrizak
چهارشنبه 16 تیر 1389, 19:55 عصر
:تشویق:
serialization : اگر مبتدی هستید فعلا بحث serialization را کنار بگذاریدسراغ یک پروژه ساده بروید و سعی کنید آن را انجام دهید تا با پیش سوالات بیشتری برخورد کنید
مسئله serialization را به بعد موکول کنید

یک توضیح مختصر در باره serialization : فرض کنید چندین تابع دارید وهر تابع چند متغیر . چگونه می توانید متغیر ها را ذخیره کنید تا هنگام راه اندازی مجدد برنامه خودتان دوباره به آن متغیر ها دسترسی داشته با شد. آیا میتوانید متغیر ها را ذخیره کرد؟ جواب :بلی با استفاده از serialization ..
آیا می دانید فوتوشاپ چگونه اطلاعات خود را ذخیره می کند و پس از اجرای دوباره از انها استفاده میکند(منظور psd.*)

masiiha
شنبه 16 مرداد 1389, 10:35 صبح
آيا ميشه اطلاعات چند فرم رو در يك فايل نگه داشت ؟

kamran00f
چهارشنبه 12 آبان 1389, 03:54 صبح
آيا ميشه اطلاعات چند فرم رو در يك فايل نگه داشت ؟

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

حالا یه مسئله مهمی که میمونه اینه که چطوری به اطلاعات فرم های مختلف توی یه تابع دسترسی داشته باشی. یه راه اینه که متغیر هایی که لازم داری رو public تعریف کنی که البته را غیر اصولی ای هست و جالب نیست. ولی می تونی تو هر فرم یه تابع public به اسم مثلا GetData بنویسی که کارش این باشه که اطلاعات مورد نیاز هر فرم رو به شکل یک ArrayList برگردونه. بعد تو تابعی که میخواد تمام اطلاعات رو سریالایز کنه یه ArrayList بساز و برای هر فرم تابع GetData رو صدا کن و اطلاعاتش رو به ArrayList مورد نظرت اضافه کن. اینجوری تمام اطلاعات رو از تمام فرم ها ذخیره کردی تو یه ArrayList. حالا این ArrayList رو سریالایز کن و بریز تو یه فایل.

ahmad2367
پنج شنبه 17 دی 1394, 11:50 صبح
Serialize و Deserialize

در این مقاله سعی می کنیم که یکی از اصلی ترین روش های ذخیره و بازیابی داده ها را معرفی کنیم .آیا تا به حال یک سیب زمینی را درون ماکروفر قرار داده اید تا پخته شود و آیا تا به حال یک سیب زمینی پخته را درون دستگاه دیگری قرار داده اید تا همان سیب زمین اول شود.
مثلماً پاسخ شما برای آیای اول مثبت و پاسخ شما برای آیای دوم یک نگاه معنی دار خواهد بود!
کار اول یعنی پختن سیب زمینی معادل عمل Serialize نمودن داده ها و کار دوم معادل Desterilize نمودن داده ها در .NET Framework می باشد.
با Serialize نمودن داده ها می توانیم آنها را در مکان های مانند فایل ، جداول پایگاه داده و یا memory buffer نگه داری کنیم و با Desterilize نمودن آنها می توانید داده ها را از مکانهای ذکر شده فراخوانی نماییم.
اگر بخواهیم مثالی برای Serialize و Desterilize داده ها بزنیم می توانید به ذخیره شدن یک فایل text از notepad و بازخوانی آن از دیسک برای نمایش مجدد اشاره نماییم، که کاملاً مشابه با فرایند Serialize و Deserialize داده ها می باشد.
از نمونه استفاده های دیگر این فرایند می توانم به موارد زیر اشاره نمایم.
1- نگه داری وضعیت یک نرم افزار (Application State Saving)
2- Copy & Paste
3- Clone Object کپی آبجکت
4- Share Object over network ارسال اطلاعات در شبکه
5- Encrypt compress objectرمز نگاری و رمز گشایی اطلاعات

Serialize: فرآیندی برای تبدیل یک آبجکت و یا گرافی متشکل از چند آبجکت به یک حالت خطی (و جریان وار) از بایت ها برای انتقال و یا ذخیره سازی در محلی دیگر است.
Deserialize : عمل برعکس سریالیزشین است؛ یعنی دوباره ساختن آبجکت از روی جریانی از بایتها .

انواع فرمت ها در سریالیزشین :
1- Binary : بصورت باینری سریالایز میکند. (فشرده ترین و efficient ترین حالت است)
SOAP -2 : بصورت soap سریالایز میکند. (برای ارسال در شبکه و جایی که از تحت دات نت بودن کلاینتها مطمئن نیستیم)
XML -3 : بصورت xml سریالایز میکند. (برای ارسال تحت شبکه - مزیت : خوانایی)

برخی از موارد کاربرد سریالزیشین:
1- کپی یک انشعاب از آبجکتها
2- انتقال اطلاعات در شبکه
3- نگهداری state ها و snapshot های مختلف در یک برنامه (برای موارد حساس : مثل تراکنشهای بانکی و ...)
4- پیاده سازی Deep Copy و Shallow Copy

برای استفاده از Serialize می بایست Namespace


using System.Runtime.Serialization.Formatters.Binary;

، و برای کار با فایل از Namespace ،System.IO در پروژه استفاده می نماییم.

در پروژه مان می خواهیم طول و عرض فرممان را در هنگام بستن فرم Serialize نماییم و در هنگام باز شدن مجدد فرم آنها را Deserialize و استفاده نماییم.
در رویداد FormClosing کد زیر را می نویسیم


private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
ArrayList arr = new ArrayList();
arr.Add(this.Width);
arr.Add(this.Height);
FileStream fs = new FileStream("C:\\Test.dat", FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, arr);

}
در این قطعه کد با قرار دادن عرض و ارتفاع فرم در یک ArrayList و ایجاد یک فایل به نام Test.dat توسط شی BinaryFormatter شی arraylist را در فایل Serialize می نماییم.
حال برای Deserialize اطلاعات قطعه کد زیر را در رویداد Load فرم می نویسم، دقت شود که قرار دادن کد در try catch به منظور جلوگیری از رویداد خطا در هنگام load اول فرم و عدم وجود فایل test.dat می باشد.


private void Form1_Load(object sender, EventArgs e)
{
try
{
using (FileStream fs = new FileStream("C:\\Test.dat", FileMode.Open))
{
BinaryFormatter bf = new BinaryFormatter();
ArrayList ar = (ArrayList)bf.Deserialize(fs);
this.Width = (int)ar[0];
this.Height = (int)ar[1];
}
}
catch { }
}
حال با اجرا فرم و تغییر سایز آن در صورتی که فرم را دوباره باز نماییم سایز آن به میزان سایز فرم قبل از بسته شدن خواهد بود.

التماس دعا...

اگه مفید بود خواستید تشکر بزنید...



سلام
توضیحاتت خیلی جالب و قشنگ بود
منم از یه سایتی به نمونه برنامه گرفتم و روش کار کردم و خوب راه افتادم
میزارم
انشاالله مورد استفاده بقیه هم باشه

اول یه کلاس به اسم data معرفی کنید

public class data
{
public int id { get; set; }
public string name { get; set; }
public string family { get; set; }
}

بعد فرم با آبجکت های زیر درست کنید138250
حالا تو قسمت کد نویسی فرم به این شکل بنویسید
ابتدا فضا کار با xml برای سریالیز کردن xml و یک فضای کار برای کار با فایل
ایجاد کنید

using System.Xml.Serialization;
using System.IO;

حالا کد نویسی اشیاء


private void button1_Click(object sender, EventArgs e)
{
XmlSerializer seriali = new XmlSerializer(typeof(data));
SaveFileDialog sf = new SaveFileDialog();
sf.Filter = "xml file|*.xml";
if (sf.ShowDialog() == DialogResult.OK)
{
string path = sf.FileName;
data d = new data();
d.id = Convert.ToInt16(txt_id.Text);
d.name = txt_name.Text;
d.family = txt_family.Text;
FileStream fs = new FileStream(path, FileMode.Create) ;
seriali.Serialize(fs , d );



}
seriali=null;
}


private void txt_id_KeyPress(object sender, KeyPressEventArgs e)
{
if (char.IsDigit(e.KeyChar) | e.KeyChar == (char)Keys.Back)
e.Handled = false;
else
e.Handled = true;
}


private void button2_Click(object sender, EventArgs e)
{
XmlSerializer seriali = new XmlSerializer(typeof(data));
OpenFileDialog op = new OpenFileDialog();
op.Filter = "open file xml|*.xml";
if (op.ShowDialog() == DialogResult.OK)
{
data d = new data();
string path = op.FileName;
FileStream fs = new FileStream(path, FileMode.Open);
d = (data)seriali.Deserialize (fs);
label2.Text = d.id.ToString();
label3.Text = d.name;
label4.Text = d.family;
}

فایل برنامه ضمیمه شده است }
138251

ghasem110deh
پنج شنبه 17 دی 1394, 15:03 عصر
:تشویق:
serialization : اگر مبتدی هستید فعلا بحث serialization را کنار بگذاریدسراغ یک پروژه ساده بروید و سعی کنید آن را انجام دهید تا با پیش سوالات بیشتری برخورد کنید
مسئله serialization را به بعد موکول کنید

یک توضیح مختصر در باره serialization : فرض کنید چندین تابع دارید وهر تابع چند متغیر . چگونه می توانید متغیر ها را ذخیره کنید تا هنگام راه اندازی مجدد برنامه خودتان دوباره به آن متغیر ها دسترسی داشته با شد. آیا میتوانید متغیر ها را ذخیره کرد؟ جواب :بلی با استفاده از serialization ..
آیا می دانید فوتوشاپ چگونه اطلاعات خود را ذخیره می کند و پس از اجرای دوباره از انها استفاده میکند(منظور psd.*)

سلام به همه ...
یعنی از این روش میشه واسه اینکار استفاده کرد :
تصاویری که از طریق برنامه ذخیره میشن توی یه دایرکتری ، (مثلا عکس با فرمت png) دیگه قابل مشاهده نباشن !؟
یا کارکرد دیگه ای داره !