در مورد Serialization از کتاب Microsoft 70-536

  1.  در دات نت فریم ورک شما وقتی یک آبجکت ایجاد می کنید، نیاز نیست در مورد چگونگی ذخیره شدن آن در حافظه فکر کنید. دات نت فریم ورک این کار را برای شما انجام خواهد داد.
  2.  اگر بخواهید محتویات یک آبجکت را در فایل ذخیره کنبد، آبجکت را به پروسس دیگری بفرستید و یا از طریق شبکه انتقال دهید شما باید در مورد اینکه این داده ها چطور نمایش داده خواهند شد فکر کنید. زیرا نیاز دارید آن را به فرمت دیگری تبدیل کنید. این تبدیل Serialization نام دارد.
  3.  Serialization در فضای System.Runtime.Serialization قرار دارد.
  4. Serializaing فرآیند تبدیل آبجکت به یک ترتیب خطی از بایت ها است که می تواند ذخیره شود و یا انتقال داده شود.
  5. Deserializing عمل عکس عمل فوق می باشد که داده هایی که در مرحله قبل Serialize شده اند را به آبجکت تبدیل می کند.
  6.  مراحل Serialize کردن به شرح زیر می باشد:
  • §         یک آبجکت استریم برای نگهداری خروجی Serialize شده ایجاد می شود.
  • §         یک آبجکت BinaryFormatter ایجاد می شود.
  • §         متد Serialize از BinaryFormatter فراخوانی می شود برای Serialize کردن آبجکت مورد نظر.

مثالی از این Serialize کردن به شرح زیر می باشد:

String data = “This must store in a file”

FileStream fs = new FilwStream(“text.Data” , FileMode.Create)

BinaryFormatter bf = new BinaryFormatter()

Bf.Serialize(fs,data)

Fs.close();

  1.   اگر بخواهید یک جمله ساده را در یک فایل بنویسید، نیاز به Serialization نیست و بهتر است که یک فایل ایجاد کنید و جمله را مستقیماً در آن بنویسید زیرا Serialization برای ذخیره سازی اطلاعات پیچیده تر مثلا تاریخ و زمان جاری مورد استفاده قرار می گیرد.
  2.  مراحل Deserialize به شرح زیر می باشد:
  • §         ایجاد یک آبجکت استریم برای خواندن خروجی Serialize شده
  • §         ایجاد یک آبجکت BinaryFormatter
  • §         ایجاد یک آبجکت برای ذخیره سازی داده های Deserialize شده
  • §         فراخوانی متد deserialize از Binaryformatter برای Deserialize کردن آبجکت و cast کردن به تایپ صحیح است.

مثالی از Deserialize کردن در زیر آورده شده است:

FileStream fs = new FileStream(“txt.data”, FileMode.Open)

BinaryFormatter  bf = new Binaryformatter()

String data = “”

Data = (string) bf.Deserialize(fs)

Fs.close();

Console.WriteLine(data)

  1.  با قرار دادن Attribute با عنوان Serializable در بالای کلاس می توان این قابلیت را برای آن کلاس در نظر گرفت.
  2. اگر با همین Serialize شدن پیش فرض موافق باشید، نیاز به کد بیشری نمی باشد که در این صورت همه اعضای کلاس، حتی Private ها هم Serialize می شوند. برای بهتر شدن کارایی می توان Serialize شدن کل را کنترل کرد.
  3. می توان Serialize شدن اعضای خاصی از کلاس را غیرفعال کرد. به عنوان مثال اگر یکی از اعضای کلاس public decimal total باشد می توان به صورت زیر از Serialize شدن آن جلوگیری کرد:

[NonSerialized] public decimal total;

  1.  با استفاده از IDeserializationCallback.OnDeserialization(Object sender)  می توان مواردی که نباید Serialize شود مشخص می گردد که در ادامه مثالی آورده شده است:

Class x: IDeserializationCallback

{

Public int a;

.

.

.

Public x(…)

{     

aa..                

bb..               

total=price * quantity           

}     

Void IDeserializationCallback.OnDeserialization(Object sender)

{     

//after deserialization calculate total              

Total=price * quantity           

}     

}

  1.  دات نت فریم ورک دو روش برای Serialize کردن دارد که هر دو آنها IremootingFormatter را پیاده سازی کرده اند:
  • §         BinaryFormatter: این روش زمانی کارا است که آبجکت ها فقط در Application های دات نت فریم ورک مورد استفاده قرار بگیرند.
  • §         SoapFormatter: این فرمت که مبتنی بر XML: است زمانی کارا است که آبجکت ها نیاز به انتقال در شبکه دارند و یا در A[[lication هایی که مبتنی بر دات نت فریم ورک نیستند می خواهند مورد استفاده قرار بگیرند. امکان موفقیت در عبور از Fierwall ها در این روش نسبت به روش BinaryFormatter بیشتر است.

  1.  اگرچه کد نوشته شده برای BinaryFormatter و SoapFormatter مشابه است اما داده ای که با هر یک از این دو روش Serialize شده ند، با یکدیگر بسیار تفاوت دارند.
  2.  حتی زمانی که در شک هستید برای Serializable کردن کلاس، باز هم این کار را بکنید زیرا ممکن است در آینده برای شما یا برای سایر برنامه نویسان مورد نیاز باشد.
  3. عضوهایی از کلاس که محاسباتی و یا Temporary  یعنی موقتی هستند را NonSerialize قرار دهید.
  4. برای داشتن قابلیت Portability یعنی قابلیت انتقال، از SoapFormatter و برای داشتن کارایی بالاتر از BinryFormatter استفاده نمایید.
  5. برای Serialize کردن با استفاده از روش SoapFormatter همان مراحل BinaryFormatter طی شود با این تفاوت که در آن از کلاس System.Runtime.Serialization.Formatters.soap.soapformatter استفاده می شود.
نظرات 1 + ارسال نظر
_ سه‌شنبه 27 دی‌ماه سال 1390 ساعت 12:41 ب.ظ

ba tashakkore faravan

برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد