التنبيهات التالية ظهرت :
Warning [2] count(): Parameter must be an array or an object that implements Countable - Line: 864 - File: showthread.php PHP 7.4.33 (Linux)
File Line Function
/showthread.php 864 errorHandler->error



تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
مقال تقني - سلسلة الكائنات Object Serialization بشكل مجمل
#1
كاتب الموضوع : أنس محمود


بسم الله الرحمن الرحيم

سلسلة الكائنات 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]

طبعا موضوع السلسلة موضوع أكبر من يشرح في مقال واحد ،
ولكن هذا المقال يجمع المختصر المفيد ،
أقدم لكم هذا المثال مع الكود

أتمنى أن أكون قد أفدتكم ولو باليسير ،
مستعد للإجابة عن أي سؤال إن شاء المولى ،

والسلام عليكم ورحمة الله وبركاته
}}}
تم الشكر بواسطة:


الردود في هذا الموضوع
مقال تقني - سلسلة الكائنات Object Serialization بشكل مجمل - بواسطة Raggi Tech - 04-10-12, 11:38 AM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  قراءة رقم من ضمن سلسلة ارقام موجودة في الحقل عبدالكريم برشدان 2 1,566 06-11-21, 11:20 PM
آخر رد: عبدالكريم برشدان
  مقال: الكومبو بوكس ComboBox كيف تضيف أيقونات Blue Sky 1 3,159 30-06-19, 10:41 AM
آخر رد: invocker
  الفرق بين الأصناف Classes و الكائنات Objects RaggiTech 1 8,069 28-03-18, 10:30 PM
آخر رد: alsouf
  [مقال] مفهوم Generics بشكل مبسط ابو ليلى 3 2,463 26-05-17, 12:18 AM
آخر رد: Fantastico
  Object MemberwiseClone Method silverlight 3 2,462 07-10-15, 02:21 AM
آخر رد: silverlight
  خطوات بسيطه لجعل الفورم على شكل صورة معينه و بشكل اكثر احترافية - بدون أدوات خارجية السكر المغرور 4 7,234 08-05-13, 01:20 AM
آخر رد: السكر المغرور
  مقال- كيفية الاستغناء عن الداتا بيز التقليدية في برامجنا – ألجزء الأول RaggiTech 1 3,426 06-10-12, 12:23 AM
آخر رد: RaggiTech
  مقال- تطوير الكونترول Property Attributes الجزء الثالث RaggiTech 0 2,268 06-10-12, 12:20 AM
آخر رد: RaggiTech
  مقال- تطوير الكونترول Skin Control RaggiTech 0 2,428 06-10-12, 12:08 AM
آخر رد: RaggiTech
  مقال- كيف تصنع ملفات المساعدة Help Files وتربطها مع برنامجك RaggiTech 0 3,189 05-10-12, 07:30 PM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم