04-10-12, 11:38 AM
كاتب الموضوع : أنس محمود
بسم الله الرحمن الرحيم
سلسلة الكائنات Object Serialization :-
بسم الله الرحمن الرحيم
سلسلة الكائنات Object Serialization :-
موضوع المقال :- سلسلة الكائنات Object Serialization .
اللغة المستخدمة :- VB.NET ( C#.NET ) .
المستوى :- متوسط .
التقيم :- ( متروك للقارئ ) .
ملاخظة :- الأكواد التي لم أذكر بأي حدث تضعها ، يمكنك تجربتها باضافة زر Button ثم إضافة الكود في الحدث Click له .
*تقديم :- نحن كمبرمجين لا تخلو برامجنا من استخدام الكائنات ، وكما تعلمون ان الكائن يموت بعد نهاية الإجراء المعرف به أو البرنامج ويتحرر من الذاكرة ( هذا مضوع كبير لا أريد التطرق إليه الآن ) ، طيب أذا أردت ان نخزن كائن ما من برنامجك على الوحدة التخزينية Stream ( القرص الصلب مثلاً .. ) لإسترجاعه فيما بعد في نفس البرنامج ، أو برنامج آخر :-
· البعض سيلجأ إلى الملفات النصية ،· ومع تعدد خصائص الكائن وتشابكها ،· تصبح هذه الطريقة غير مجدية .
· و البعض سيلجأ إلى قواعد البيانات ! وما أدراك ما قواعد البيانات ! مشاكل اتصال ،· و تعقيدات الجداول وما الى ذلك ،· لذلك فإني أعتبر أن هذه الطريقة غير عملية .
· والبعض الآخر سيريح رأسه من كل ذلك ،· ويلجأ إلى السلسلة Serialization ،· فما هي السلسلة ؟ وكيف يتم استخدامها ؟ وهل يمكن سلسلة جميع الكائنات ؟ .. إلخ
· كل هذه الأسئلة واكثر ستجد الإجابة عنها في هذا المقال بإذن الله .
*ماذا يمكنك فعله بعد قراءة هذا المقال ؟ :- باختصار ؛ بعد قراءة هذا المقال سيصبح بإمكانك أن تسلسل أي كائن قابل للسلسلة Serializable Object وتستعيده مرة اخرى
مفهوم السلسلة Serialization و كسر السلسة DiSerialization :عملية السلسلة Serialization هي عملية نسخ بينات كائن من الذاكرة ( حفظ الكائن ) الى وحدة تخزينية خاصة Stream ، وعملية استعادة هذا الكائن من الوحدة التخزينية التي تم سلسلته إليها تسمى كسر السلسلة DiSerialization .
كمثال على ذلك ، الكود التالي يسلسل المصفوفة التالية الى المسار "C:\Array.bin" :-
كود :
[color=#000000][COLOR=#0000bb]Dim ObjectStream [/color][color=#007700]As [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileStream [/color][color=#007700]= [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]File[/color][color=#007700].[/color][color=#0000bb]Open[/color][color=#007700]([/color][color=#dd0000]"C:\Array.bin"[/color][color=#007700], [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileMode[/color][color=#007700].[/color][color=#0000bb]OpenOrCreate[/color][COLOR=#007700])
[/COLOR][color=#0000bb]Dim Ser_Object [/color][color=#007700]As New [/color][color=#0000bb]Runtime[/color][color=#007700].[/color][color=#0000bb]Serialization[/color][color=#007700].[/color][color=#0000bb]Formatters[/color][color=#007700].[/color][color=#0000bb]Binary[/color][color=#007700].[/color][color=#0000bb]BinaryFormatter[/color][COLOR=#007700]()
[/COLOR][color=#0000bb]Dim Ser_Array [/color][color=#007700]As [/color][color=#0000bb]String[/color][color=#007700]() = {[/color][color=#dd0000]"Object"[/color][color=#007700], [/color][color=#dd0000]"Serialization"[/color][color=#007700], [/color][color=#dd0000]"الكائنات"[/color][color=#007700], [/color][color=#dd0000]"سلسلة"[/color][COLOR=#007700]}
[/COLOR][color=#0000bb]Ser_Object[/color][color=#007700].[/color][color=#0000bb]Serialize[/color][color=#007700]([/color][color=#0000bb]ObjectStream[/color][color=#007700], [/color][color=#0000bb]Ser_Array[/color][COLOR=#007700])
[/COLOR][color=#0000bb]ObjectStream[/color][color=#007700].[/color][color=#0000bb]Close[/color][COLOR=#007700]()
[/COLOR][/COLOR]
والكود التلي لكسر السلسلة ، واعادة المصفوفة من المسار "C:\Array.bin" :-
كود :
[color=#000000][COLOR=#0000bb] Dim ObjectStream [/color][color=#007700]As [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileStream [/color][color=#007700]= [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]File[/color][color=#007700].[/color][color=#0000bb]Open[/color][color=#007700]([/color][color=#dd0000]"C:\Array.bin"[/color][color=#007700], [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileMode[/color][color=#007700].[/color][color=#0000bb]OpenOrCreate[/color][COLOR=#007700])
[/COLOR][color=#0000bb]Dim Ser_Object [/color][color=#007700]As New [/color][color=#0000bb]Runtime[/color][color=#007700].[/color][color=#0000bb]Serialization[/color][color=#007700].[/color][color=#0000bb]Formatters[/color][color=#007700].[/color][color=#0000bb]Binary[/color][color=#007700].[/color][color=#0000bb]BinaryFormatter[/color][COLOR=#007700]()
[/COLOR][color=#0000bb]Dim Ser_Array [/color][color=#007700]As [/color][color=#0000bb]String[/color][color=#007700]() = [/color][color=#0000bb]Ser_Object[/color][color=#007700].[/color][color=#0000bb]Deserialize[/color][color=#007700]([/color][color=#0000bb]ObjectStream[/color][COLOR=#007700])
[/COLOR][color=#0000bb]ObjectStream[/color][color=#007700].[/color][color=#0000bb]Close[/color][COLOR=#007700]()
[/COLOR][/COLOR]
الخطوات اللازمة لعملية السلسلة :-
· تعريف Stream للمسار و فتحه .
· تعريف كائن جديد من فئة السلسلة .
· إستدعاء الطريقة Serialize لكائن السلسلة وارسال الـ Stream و والكائن المراد سلسلته .
· اغلاق الـ Stream .
نفس الخطوات لعملية كسر السلسلة ، ولكن في الخطوة الثالثة :
استدعاء الدالة DiSerializeوارسال الـ Stream وتخزين ما ترجعه في مؤشر الكائن المراد اعادته
الكائنات القابلة للسلسلة :- لا يمكنك سلسلة جميع الكائنات ، حيث يشترط أن تسبق فئة الكائن عند تعريفها المواصفة <System.Serializable> ، فالكائنات المسبوقة فئاتها بهذه المواصفة ، يمكن سلسلتها ( مثل الفئات : String , Integer , Array , …. وأغلب فئات إطار العمل .Net FreamWork ) ، أما الفئات الغير مسبوقة بهذه المواصفة فلا يمكن سلسلة الكائنات المنشئة منها ( مثل : الفئة Control ومشتقاتها )
مثال : لنقم يتعريف فئة خاصة مرة بالمواصفة <System.Serializable> ومرة بدونها ، لنر تأثير هذه المواصفة :
<
كود :
[color=#000000][COLOR=#0000bb]System[/color][color=#007700].[/color][color=#0000bb]Serializable[/color][color=#007700]()> [/color][COLOR=#0000bb]_
[/COLOR][color=#007700]Public Class [/color][COLOR=#0000bb]TestWith
[/COLOR][color=#007700]Public [/color][color=#0000bb]Faild [/color][color=#007700]As [/color][COLOR=#0000bb]Integer
[/COLOR][color=#007700]Public [/color][color=#0000bb]Faild2 [/color][color=#007700]As [/color][COLOR=#0000bb]String
End [/COLOR][COLOR=#007700]Class
Public Class [/COLOR][COLOR=#0000bb]TestWithOut
[/COLOR][color=#007700]Public [/color][color=#0000bb]Faild [/color][color=#007700]As [/color][COLOR=#0000bb]Integer
[/COLOR][color=#007700]Public [/color][color=#0000bb]Faild2 [/color][color=#007700]As [/color][COLOR=#0000bb]String
End [/COLOR][COLOR=#007700]Class
[/COLOR][/COLOR]
الآن نقوم بتعريف كائن من الفئة الأولى ، ثم نسلسله :-
كود :
[color=#000000][COLOR=#0000bb]Dim Ser_Class [/color][color=#007700]As New [/color][COLOR=#0000bb]TestWith
Ser_Class[/COLOR][color=#007700].[/color][color=#0000bb]Faild [/color][color=#007700]= [/color][COLOR=#0000bb]55
Ser_Class[/COLOR][color=#007700].[/color][color=#0000bb]Faild2 [/color][color=#007700]= [/color][COLOR=#dd0000]"Ser"
[/COLOR][color=#0000bb]Dim ObjectStream [/color][color=#007700]As [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileStream [/color][color=#007700]= [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]File[/color][color=#007700].[/color][color=#0000bb]Open[/color][color=#007700]([/color][color=#dd0000]"C:\TestWith.bin"[/color][color=#007700], [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileMode[/color][color=#007700].[/color][color=#0000bb]OpenOrCreate[/color][COLOR=#007700])
[/COLOR][color=#0000bb]Dim Ser_Object [/color][color=#007700]As New [/color][color=#0000bb]Runtime[/color][color=#007700].[/color][color=#0000bb]Serialization[/color][color=#007700].[/color][color=#0000bb]Formatters[/color][color=#007700].[/color][color=#0000bb]Binary[/color][color=#007700].[/color][color=#0000bb]BinaryFormatter[/color][COLOR=#007700]()
[/COLOR][color=#0000bb]Ser_Object[/color][color=#007700].[/color][color=#0000bb]Serialize[/color][color=#007700]([/color][color=#0000bb]ObjectStream[/color][color=#007700], [/color][color=#0000bb]Ser_Class[/color][COLOR=#007700])
[/COLOR][color=#0000bb]ObjectStream[/color][color=#007700].[/color][color=#0000bb]Close[/color][COLOR=#007700]()
[/COLOR][/COLOR]
قم بتجريب الكود السابق ، كما ترى تمت عملية السلسلة بدون أي مشكلة ، الآن لنجرب تعريف كائن من الفئة الثانية ثم سلسلته ، استبدل الكود السابق بما يلي :-
كود :
[color=#000000][COLOR=#0000bb]Dim Ser_Class [/color][color=#007700]As New [/color][COLOR=#0000bb]TestWithOut
Ser_Class[/COLOR][color=#007700].[/color][color=#0000bb]Faild [/color][color=#007700]= [/color][COLOR=#0000bb]55
Ser_Class[/COLOR][color=#007700].[/color][color=#0000bb]Faild2 [/color][color=#007700]= [/color][COLOR=#dd0000]"Ser"
[/COLOR][color=#0000bb]Dim ObjectStream [/color][color=#007700]As [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileStream [/color][color=#007700]= [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]File[/color][color=#007700].[/color][color=#0000bb]Open[/color][color=#007700]([/color][color=#dd0000]"C:\TestWith.bin"[/color][color=#007700], [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileMode[/color][color=#007700].[/color][color=#0000bb]OpenOrCreate[/color][COLOR=#007700])
[/COLOR][color=#0000bb]Dim Ser_Object [/color][color=#007700]As New [/color][color=#0000bb]Runtime[/color][color=#007700].[/color][color=#0000bb]Serialization[/color][color=#007700].[/color][color=#0000bb]Formatters[/color][color=#007700].[/color][color=#0000bb]Binary[/color][color=#007700].[/color][color=#0000bb]BinaryFormatter[/color][COLOR=#007700]()
[/COLOR][color=#0000bb]Ser_Object[/color][color=#007700].[/color][color=#0000bb]Serialize[/color][color=#007700]([/color][color=#0000bb]ObjectStream[/color][color=#007700], [/color][color=#0000bb]Ser_Class[/color][COLOR=#007700])
[/COLOR][color=#0000bb]ObjectStream[/color][color=#007700].[/color][color=#0000bb]Close[/color][COLOR=#007700]()
[/COLOR][/COLOR]
قم بتجريب الكود السابق ، كما تلاحظ ظهر خطأ في السطر الأخير شبيه بما يي :-
كود :
[color=#000000][COLOR=#0000bb] Type TestWithOut is not marked [/color][color=#007700]as [/color][color=#0000bb]serializable[/color][COLOR=#007700].
[/COLOR][/COLOR]
لدي أشياء أود توضيحها :
1. عند عكس عملية التسلسل ، لا داعي لإنشاء نسخة جديدة من الفئة باستخدام الكلمة المحجوزة New لأن نسخة الكائن موجودة بالفعل في وحدة التخزين .
2. استخدامك للمواصفة <System.Serializable> ستجعل جميع بيانات الكائن المنشأ من الفئة قابلة للتسلسل ، أما إذا أردت أن تمنع حقل في الفئة غير قابل للتسلسل ، فيمكنك ذلك عن طريق إضافة المواصفة <NonSerialized> قبل تعريف الحقل في الفئة مثل :-
كود :
[color=#000000][COLOR=#007700]Public Class [/color][COLOR=#0000bb]TestWith
[/COLOR][color=#007700]Public [/color][color=#0000bb]Faild [/color][color=#007700]As [/color][COLOR=#0000bb]Integer
[/COLOR][color=#007700]<[/color][color=#0000bb]NonSerialized[/color][color=#007700]()> Public [/color][color=#0000bb]Faild2 [/color][color=#007700]As [/color][COLOR=#0000bb]Integer
End [/COLOR][COLOR=#007700]Class
[/COLOR][/COLOR]
3. عند عكس عملية السلسلة لكائنات من فئاتك الخاصة يجب أن تكون هذه الفئة معرفة في البرنامج ، وذلك بتعريفها في شفرة البرنامج أو إضافتها للمراجع Reference .
*أنواع السلسة :-
1.السلسلة بالصيغة الثنائية Binary Serialization :-
كل ما قمنا بكتابته من شفرات الى الآن تعتمد على الصيغة الثنائية في سلسلة الكائنات ، الفئة التي تمكنك من السلسلة بهذه الطريقة هي :-
كود :
[color=#000000][COLOR=#0000bb]Runtime[/color][color=#007700].[/color][color=#0000bb]Serialization[/color][color=#007700].[/color][color=#0000bb]Formatters[/color][color=#007700].[/color][color=#0000bb]Binary[/color][color=#007700].[/color][COLOR=#0000bb]BinaryFormatter
[/COLOR][/COLOR]
تحتوي هذه الفئة على وسيلتين لسلسلة وعكس سلسلة الكائنات الأولى : Serialize والثانية : DiSerialize ، والمثال :
كود :
[color=#000000][COLOR=#0000bb]Dim ObjectStream [/color][color=#007700]As [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileStream [/color][color=#007700]= [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]File[/color][color=#007700].[/color][color=#0000bb]Open[/color][color=#007700]([/color][color=#dd0000]"C:\Array.bin"[/color][color=#007700], [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileMode[/color][color=#007700].[/color][color=#0000bb]OpenOrCreate[/color][COLOR=#007700])
[/COLOR][color=#0000bb]Dim Ser_Object [/color][color=#007700]As New [/color][color=#0000bb]Runtime[/color][color=#007700].[/color][color=#0000bb]Serialization[/color][color=#007700].[/color][color=#0000bb]Formatters[/color][color=#007700].[/color][color=#0000bb]Binary[/color][color=#007700].[/color][color=#0000bb]BinaryFormatter[/color][COLOR=#007700]()
[/COLOR][color=#0000bb]Dim Ser_Array [/color][color=#007700]As [/color][color=#0000bb]String[/color][color=#007700]() = {[/color][color=#dd0000]"Object"[/color][color=#007700], [/color][color=#dd0000]"Serialization"[/color][color=#007700], [/color][color=#dd0000]"الكائنات"[/color][color=#007700], [/color][color=#dd0000]"سلسلة"[/color][COLOR=#007700]}
[/COLOR][color=#0000bb]Ser_Object[/color][color=#007700].[/color][color=#0000bb]Serialize[/color][color=#007700]([/color][color=#0000bb]ObjectStream[/color][color=#007700], [/color][color=#0000bb]Ser_Array[/color][COLOR=#007700])
[/COLOR][color=#0000bb]ObjectStream[/color][color=#007700].[/color][color=#0000bb]Close[/color][COLOR=#007700]()
[/COLOR][/COLOR]
عكس السلسلة :
كود :
[color=#000000][COLOR=#0000bb]Dim ObjectStream [/color][color=#007700]As [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileStream [/color][color=#007700]= [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]File[/color][color=#007700].[/color][color=#0000bb]Open[/color][color=#007700]([/color][color=#dd0000]"C:\Array.bin"[/color][color=#007700], [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileMode[/color][color=#007700].[/color][color=#0000bb]OpenOrCreate[/color][COLOR=#007700])
[/COLOR][color=#0000bb]Dim Ser_Object [/color][color=#007700]As New [/color][color=#0000bb]Runtime[/color][color=#007700].[/color][color=#0000bb]Serialization[/color][color=#007700].[/color][color=#0000bb]Formatters[/color][color=#007700].[/color][color=#0000bb]Binary[/color][color=#007700].[/color][color=#0000bb]BinaryFormatter[/color][COLOR=#007700]()
[/COLOR][color=#0000bb]Dim Ser_Array [/color][color=#007700]As [/color][color=#0000bb]String[/color][color=#007700]() = [/color][color=#0000bb]Ser_Object[/color][color=#007700].[/color][color=#0000bb]Deserialize[/color][color=#007700]([/color][color=#0000bb]ObjectStream[/color][COLOR=#007700])
[/COLOR][color=#0000bb]ObjectStream[/color][color=#007700].[/color][color=#0000bb]Close[/color][COLOR=#007700]()
[/COLOR][/COLOR]
مميزات استخدام هذه الطريقة ( لست بصدد شرح كل منها على حدة ، ولكني مستعد لذلك إذا طُلب ) :-
1 ) كل حقول الكائن يتم سلسلتها مالم تسبق عند تعريفها بالمواصفة <NonSerialized>
2 ) سيتم تضمين كل الكائنات الموجودة في خريطة الكائنات Object Graph للكائن المسلسل
3 ) في حالة المرجعية الدائرية لن يتم تكرار سلسلة الكائنات الفرعية إلا مرة واحدة
2.السلسلة بصيغة XML :-
الفئة التي تمكنك من السلسلة بهذه الطريقة هي :-
كود :
[color=#000000][COLOR=#0000bb] Xml[/color][color=#007700].[/color][color=#0000bb]Serialization[/color][color=#007700].[/color][COLOR=#0000bb]XmlSerializer
[/COLOR][/COLOR]
يرجي مراعاة أنه عند انشاء نسخة من هذه الفئة يتم ارسال نوع الكائن المراد سلسلته باستخدام GetType() ،
تحتوي هذه الفئة ( مثل سابقتها ) على وسيلتين أيضاً لسلسلة وعكس سلسلة الكائنات الأولى : Serialize والثانية : DiSerialize ، والمثال السلسلة :
كود :
[color=#000000][COLOR=#0000bb]Dim ObjectStream [/color][color=#007700]As [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileStream [/color][color=#007700]= [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]File[/color][color=#007700].[/color][color=#0000bb]Open[/color][color=#007700]([/color][color=#dd0000]"C:\TestWlith.xml"[/color][color=#007700], [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileMode[/color][color=#007700].[/color][color=#0000bb]OpenOrCreate[/color][COLOR=#007700])
[/COLOR][color=#0000bb]Dim Ser_Object [/color][color=#007700]As New [/color][color=#0000bb]Xml[/color][color=#007700].[/color][color=#0000bb]Serialization[/color][color=#007700].[/color][color=#0000bb]XmlSerializer[/color][color=#007700]([/color][color=#0000bb]GetType[/color][color=#007700]([/color][color=#0000bb]Object[/color][COLOR=#007700]()))
[/COLOR][color=#0000bb]Dim Ser_Array [/color][color=#007700]As [/color][color=#0000bb]String[/color][color=#007700]() = {[/color][color=#dd0000]"Object"[/color][color=#007700], [/color][color=#dd0000]"Serialization"[/color][color=#007700], [/color][color=#dd0000]"الكائنات"[/color][color=#007700], [/color][color=#dd0000]"سلسلة"[/color][COLOR=#007700]}
[/COLOR][color=#0000bb]Ser_Object[/color][color=#007700].[/color][color=#0000bb]Serialize[/color][color=#007700]([/color][color=#0000bb]ObjectStream[/color][color=#007700], [/color][color=#0000bb]Ser_Array[/color][COLOR=#007700])
[/COLOR][color=#0000bb]ObjectStream[/color][color=#007700].[/color][color=#0000bb]Close[/color][COLOR=#007700]()
[/COLOR][/COLOR]
مميزات استخدام هذه الطريقة :-
1.يمكن لمن يجيد لغة XML قراءة ملف الكائن المخزن بسهولة ، وكذلك يمكنه تعديل القيم
2.لست بحاجة الى استخدام المواصفة <System.Serializable> لتكون الفئة قابلة للتسلسل ، فقط أنت بحاجة إلى تعريف الفئة بمحدد الوصول Public
عيوب هذه الطريقة :-
1.لا يمكنك تطبيق السلسلة إلى على الفئات المعرفة بمحدد الوصول Public
2.فقط الحقول المعرفة بمحدد الوصول Public هي التي سيتم تطبيق السلسلة عليها
3.لن يتم تنفيذ السلسلة في حالة المرجعية الدائرية
كان الأخ أبو يعقوب قد قدم في موضوع له فئة لحفظ واسترجاع الكائنات :-
كود :
[color=#000000][COLOR=#0000bb]Imports System[/color][color=#007700].[/color][COLOR=#0000bb]IO
Imports System[/COLOR][color=#007700].[/color][color=#0000bb]Runtime[/color][color=#007700].[/color][color=#0000bb]Serialization[/color][color=#007700].[/color][color=#0000bb]Formatters[/color][color=#007700].[/color][COLOR=#0000bb]Binary
[/COLOR][color=#007700]Public Class [/color][COLOR=#0000bb]ClassFile
[/COLOR][COLOR=#dd0000]'محتويات الكائن
Private _Content As Object
Public Property Content() As Object
Get
Return _Content
End Get
Set(ByVal value As Object)
_Content = value
End Set
End Property
'[/COLOR][COLOR=#0000bb]اسم ومكان الملف
[/COLOR][color=#007700]Private [/color][color=#0000bb]_FileName [/color][color=#007700]As [/color][COLOR=#0000bb]String
[/COLOR][color=#007700]Public [/color][color=#0000bb]Property FileName[/color][color=#007700]() As [/color][COLOR=#0000bb]String
Get
[/COLOR][color=#007700]Return [/color][COLOR=#0000bb]_FileName
End Get
Set[/COLOR][color=#007700]([/color][color=#0000bb]ByVal value [/color][color=#007700]As [/color][color=#0000bb]String[/color][COLOR=#007700])
[/COLOR][color=#0000bb]_FileName [/color][color=#007700]= [/color][COLOR=#0000bb]value
End Set
End Property
[/COLOR][COLOR=#dd0000]'Contentتحميل بينات الملف ونسخها الى الخاصية
Public Function Load()
Try
Dim st As IO.FileStream = IO.File.Open(FileName, IO.FileMode.Open)
Dim ser As New BinaryFormatter
Content = ser.Deserialize(st)
st.Close()
Return Content
Catch ex As Exception
Return Nothing
End Try
End Function
'[/COLOR][COLOR=#0000bb]حفظ بيانات الفئة داخل الملف
[/COLOR][color=#007700]Public [/color][color=#0000bb]Sub Save[/color][COLOR=#007700]()
Try
[/COLOR][color=#0000bb]Dim st [/color][color=#007700]As [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileStream [/color][color=#007700]= [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]File[/color][color=#007700].[/color][color=#0000bb]Open[/color][color=#007700]([/color][color=#0000bb]FileName[/color][color=#007700], [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileMode[/color][color=#007700].[/color][color=#0000bb]Create[/color][COLOR=#007700])
[/COLOR][color=#0000bb]Dim ser [/color][color=#007700]As New [/color][COLOR=#0000bb]BinaryFormatter
ser[/COLOR][color=#007700].[/color][color=#0000bb]Serialize[/color][color=#007700]([/color][color=#0000bb]st[/color][color=#007700], [/color][color=#0000bb]Content[/color][COLOR=#007700])
[/COLOR][color=#0000bb]st[/color][color=#007700].[/color][color=#0000bb]Close[/color][COLOR=#007700]()
Catch [/COLOR][color=#0000bb]ex [/color][color=#007700]As [/color][COLOR=#0000bb]Exception
End [/COLOR][COLOR=#007700]Try
[/COLOR][COLOR=#0000bb]End Sub
[/COLOR][color=#007700]Public [/color][color=#0000bb]Sub [/color][color=#007700]New([/color][color=#0000bb]ByVal FileName [/color][color=#007700]As [/color][color=#0000bb]String[/color][color=#007700], [/color][color=#0000bb]ByRef Content [/color][color=#007700]As [/color][color=#0000bb]Object[/color][COLOR=#007700])
Try
[/COLOR][color=#0000bb]Me[/color][color=#007700].[/color][color=#0000bb]FileName [/color][color=#007700]= [/color][COLOR=#0000bb]FileName
Me[/COLOR][color=#007700].[/color][color=#0000bb]Content [/color][color=#007700]= [/color][COLOR=#0000bb]Content
[/COLOR][color=#007700]Catch [/color][color=#0000bb]ex [/color][color=#007700]As [/color][COLOR=#0000bb]Exception
End [/COLOR][COLOR=#007700]Try
[/COLOR][COLOR=#0000bb]End Sub
[/COLOR][color=#007700]Public [/color][color=#0000bb]Sub [/color][color=#007700]New([/color][color=#0000bb]ByVal FileName [/color][color=#007700]As [/color][color=#0000bb]String[/color][COLOR=#007700])
[/COLOR][color=#0000bb]Me[/color][color=#007700].[/color][color=#0000bb]FileName [/color][color=#007700]= [/color][COLOR=#0000bb]FileName
End Sub
[/COLOR][color=#007700]Public [/color][color=#0000bb]Sub [/color][COLOR=#007700]New()
[/COLOR][COLOR=#0000bb]End Sub
End [/COLOR][COLOR=#007700]Class
[/COLOR][/COLOR]
*في الختام أقدم نفس الفئة ولكن للسلسلة بالـ Xml و الـ Binary معا ( لا حظ الخاصية SerializationType) :-
كود :
[color=#000000][COLOR=#0000bb]Imports System[/color][color=#007700].[/color][COLOR=#0000bb]IO
Imports System[/COLOR][color=#007700].[/color][color=#0000bb]Xml[/color][color=#007700].[/color][COLOR=#0000bb]Serialization
Imports System[/COLOR][color=#007700].[/color][color=#0000bb]Runtime[/color][color=#007700].[/color][color=#0000bb]Serialization[/color][color=#007700].[/color][color=#0000bb]Formatters[/color][color=#007700].[/color][COLOR=#0000bb]Binary
[/COLOR][color=#007700]Public Class [/color][color=#0000bb]ClassFile[/color][color=#007700]([/color][color=#0000bb]Of T[/color][COLOR=#007700])
[/COLOR][COLOR=#0000bb]Enum Serialization_Type
XML
Binary
End Enum
[/COLOR][color=#007700]Private [/color][color=#0000bb]_SerializationType [/color][color=#007700]As [/color][color=#0000bb]Serialization_Type [/color][color=#007700]= [/color][color=#0000bb]Serialization_Type[/color][color=#007700].[/color][COLOR=#0000bb]Binary
[/COLOR][color=#007700]Public [/color][color=#0000bb]Property SerializationType[/color][color=#007700]() As [/color][COLOR=#0000bb]Serialization_Type
Get
[/COLOR][color=#007700]Return [/color][COLOR=#0000bb]_SerializationType
End Get
Set[/COLOR][color=#007700]([/color][color=#0000bb]ByVal value [/color][color=#007700]As [/color][color=#0000bb]Serialization_Type[/color][COLOR=#007700])
[/COLOR][color=#0000bb]_SerializationType [/color][color=#007700]= [/color][COLOR=#0000bb]value
End Set
End Property
[/COLOR][COLOR=#dd0000]'محتويات الكائن
Private _Content As Object
Public Property Content() As T
Get
Return _Content
End Get
Set(ByVal value As T)
_Content = value
End Set
End Property
'[/COLOR][COLOR=#0000bb]اسم ومكان الملف
[/COLOR][color=#007700]Private [/color][color=#0000bb]_FileName [/color][color=#007700]As [/color][COLOR=#0000bb]String
[/COLOR][color=#007700]Public [/color][color=#0000bb]Property FileName[/color][color=#007700]() As [/color][COLOR=#0000bb]String
Get
[/COLOR][color=#007700]Return [/color][COLOR=#0000bb]_FileName
End Get
Set[/COLOR][color=#007700]([/color][color=#0000bb]ByVal value [/color][color=#007700]As [/color][color=#0000bb]String[/color][COLOR=#007700])
[/COLOR][color=#0000bb]_FileName [/color][color=#007700]= [/color][COLOR=#0000bb]value
End Set
End Property
[/COLOR][COLOR=#dd0000]'Contentتحميل بينات الملف ونسخها الى الخاصية
Public Function Load() As T
Try
Dim st As IO.FileStream = IO.File.Open(FileName, IO.FileMode.Open)
Dim Xml_ser As New XmlSerializer(GetType(T))
Dim Bin_ser As New BinaryFormatter
If SerializationType = Serialization_Type.XML Then
Content = Xml_ser.Deserialize(st)
Else
Content = Bin_ser.Deserialize(st)
End If
st.Close()
Return Content
Catch ex As Exception
Return Nothing
End Try
End Function
'[/COLOR][COLOR=#0000bb]حفظ بيانات الفئة داخل الملف
[/COLOR][color=#007700]Public [/color][color=#0000bb]Sub Save[/color][COLOR=#007700]()
Try
[/COLOR][color=#0000bb]Dim st [/color][color=#007700]As [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileStream [/color][color=#007700]= [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]File[/color][color=#007700].[/color][color=#0000bb]Open[/color][color=#007700]([/color][color=#0000bb]FileName[/color][color=#007700], [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileMode[/color][color=#007700].[/color][color=#0000bb]Create[/color][COLOR=#007700])
[/COLOR][color=#0000bb]Dim Xml_ser [/color][color=#007700]As New [/color][color=#0000bb]XmlSerializer[/color][color=#007700]([/color][color=#0000bb]GetType[/color][color=#007700]([/color][color=#0000bb]T[/color][COLOR=#007700]))
[/COLOR][color=#0000bb]Dim Bin_ser [/color][color=#007700]As New [/color][COLOR=#0000bb]BinaryFormatter
[/COLOR][color=#007700]If [/color][color=#0000bb]SerializationType [/color][color=#007700]= [/color][color=#0000bb]Serialization_Type[/color][color=#007700].[/color][COLOR=#0000bb]XML Then
Xml_ser[/COLOR][color=#007700].[/color][color=#0000bb]Serialize[/color][color=#007700]([/color][color=#0000bb]st[/color][color=#007700], [/color][color=#0000bb]Content[/color][COLOR=#007700])
Else
[/COLOR][color=#0000bb]Bin_ser[/color][color=#007700].[/color][color=#0000bb]Serialize[/color][color=#007700]([/color][color=#0000bb]st[/color][color=#007700], [/color][color=#0000bb]Content[/color][COLOR=#007700])
[/COLOR][color=#0000bb]End [/color][COLOR=#007700]If
[/COLOR][color=#0000bb]st[/color][color=#007700].[/color][color=#0000bb]Close[/color][COLOR=#007700]()
Catch [/COLOR][color=#0000bb]ex [/color][color=#007700]As [/color][COLOR=#0000bb]Exception
End [/COLOR][COLOR=#007700]Try
[/COLOR][COLOR=#0000bb]End Sub
[/COLOR][color=#007700]Public [/color][color=#0000bb]Sub [/color][color=#007700]New([/color][color=#0000bb]ByVal FileName [/color][color=#007700]As [/color][color=#0000bb]String[/color][color=#007700], [/color][color=#0000bb]ByRef Content [/color][color=#007700]As [/color][color=#0000bb]T[/color][color=#007700], [/color][color=#0000bb]ByVal SerializationType [/color][color=#007700]As [/color][color=#0000bb]Serialization_Type[/color][COLOR=#007700])
Try
[/COLOR][color=#0000bb]Me[/color][color=#007700].[/color][color=#0000bb]FileName [/color][color=#007700]= [/color][COLOR=#0000bb]FileName
Me[/COLOR][color=#007700].[/color][color=#0000bb]Content [/color][color=#007700]= [/color][COLOR=#0000bb]Content
Me[/COLOR][color=#007700].[/color][color=#0000bb]SerializationType [/color][color=#007700]= [/color][COLOR=#0000bb]SerializationType
[/COLOR][color=#007700]Catch [/color][color=#0000bb]ex [/color][color=#007700]As [/color][COLOR=#0000bb]Exception
End [/COLOR][COLOR=#007700]Try
[/COLOR][COLOR=#0000bb]End Sub
[/COLOR][color=#007700]Public [/color][color=#0000bb]Sub [/color][color=#007700]New([/color][color=#0000bb]ByVal FileName [/color][color=#007700]As [/color][color=#0000bb]String[/color][color=#007700], [/color][color=#0000bb]ByVal SerializationType [/color][color=#007700]As [/color][color=#0000bb]Serialization_Type[/color][COLOR=#007700])
[/COLOR][color=#0000bb]Me[/color][color=#007700].[/color][color=#0000bb]FileName [/color][color=#007700]= [/color][COLOR=#0000bb]FileName
Me[/COLOR][color=#007700].[/color][color=#0000bb]SerializationType [/color][color=#007700]= [/color][COLOR=#0000bb]SerializationType
End Sub
[/COLOR][color=#007700]Public [/color][color=#0000bb]Sub [/color][COLOR=#007700]New()
[/COLOR][COLOR=#0000bb]End Sub
End [/COLOR][COLOR=#007700]Class
[/COLOR][/COLOR]
مثال على ذلك :-
كود :
[color=#000000][COLOR=#0000bb] Dim Ser_Array [/color][color=#007700]As [/color][color=#0000bb]String[/color][color=#007700]() = {[/color][color=#dd0000]"Object"[/color][color=#007700], [/color][color=#dd0000]"Serialization"[/color][color=#007700], [/color][color=#dd0000]"الكائنات"[/color][color=#007700], [/color][color=#dd0000]"سلسلة"[/color][COLOR=#007700]}
[/COLOR][color=#0000bb]Dim S [/color][color=#007700]As New [/color][color=#0000bb]ClassFile[/color][color=#007700]([/color][color=#0000bb]Of String[/color][color=#007700]())([/color][color=#dd0000]"C:\Anas.xml"[/color][color=#007700], [/color][color=#0000bb]Ser_Array[/color][color=#007700], [/color][color=#0000bb]ClassFile[/color][color=#007700]([/color][color=#0000bb]Of String[/color][color=#007700]()).[/color][color=#0000bb]Serialization_Type[/color][color=#007700].[/color][color=#0000bb]XML[/color][COLOR=#007700])
[/COLOR][color=#0000bb]S[/color][color=#007700].[/color][color=#0000bb]Save[/color][color=#007700]() [/color][COLOR=#dd0000]'Binary DiSerialization
S = New ClassFile(Of String())("C:\Anas.bin", Ser_Array, ClassFile(Of String()).Serialization_Type.Binary)
S.Save() '[/COLOR][COLOR=#0000bb]XML Serialization
[/COLOR][/COLOR]
ومثال على عكس السلسلة :-
كود :
[color=#000000][COLOR=#0000bb]Dim Ser_Array [/color][color=#007700]As [/color][color=#0000bb]String[/color][COLOR=#007700]()
[/COLOR][color=#0000bb]Dim S [/color][color=#007700]As New [/color][color=#0000bb]ClassFile[/color][color=#007700]([/color][color=#0000bb]Of String[/color][color=#007700]())([/color][color=#dd0000]"C:\Anas.xml"[/color][color=#007700], [/color][color=#0000bb]ClassFile[/color][color=#007700]([/color][color=#0000bb]Of String[/color][color=#007700]()).[/color][color=#0000bb]Serialization_Type[/color][color=#007700].[/color][color=#0000bb]XML[/color][COLOR=#007700])
[/COLOR][color=#0000bb]Ser_Array [/color][color=#007700]= [/color][color=#0000bb]S[/color][color=#007700].[/color][color=#0000bb]Load[/color][color=#007700]()[/color][COLOR=#dd0000]'XML DiSerialization
S = New ClassFile(Of String())("C:\Anas.bin", ClassFile(Of String()).Serialization_Type.Binary)
Ser_Array = S.Load()'[/COLOR][COLOR=#0000bb]Binary DiSerialization
[/COLOR][/COLOR]
طبعا موضوع السلسلة موضوع أكبر من يشرح في مقال واحد ،
ولكن هذا المقال يجمع المختصر المفيد ،
أقدم لكم هذا المثال مع الكود
أتمنى أن أكون قد أفدتكم ولو باليسير ،
مستعد للإجابة عن أي سؤال إن شاء المولى ،
والسلام عليكم ورحمة الله وبركاته