Moving Complex Objects Across The Net Using Serlialization - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : قسم لغة السي شارب C#.NET (http://vb4arb.com/vb/forumdisplay.php?fid=175) +--- قسم : قسم مقالات C#.NET (http://vb4arb.com/vb/forumdisplay.php?fid=177) +--- الموضوع : Moving Complex Objects Across The Net Using Serlialization (/showthread.php?tid=8104) |
Moving Complex Objects Across The Net Using Serlialization - Sajad - 23-03-13 [COLOR="#A52A2A"] بسم الله الرحمن الرحيم [/COLOR]((رب اشرح لي صدري ويسر لي امري واحلل عقدة من لساني يفقهوا قولي)) صدق الله العلي العظيم السلام عليكم اعضاء و زوار المنتدى ورحمة الله وبركاته ان شاء الله تكونوا في صحة وعافية تكلمنا في موضوع Moving Complex Objects Across The Net عن كيفية نقل البيانات عبر الشبكة باستخدام بروتوكولات معينة وتطرقنا ايضا عن كيفية نقل مجموعة مختلفة من البيانات ( int, float, double, string, ….. ) كوحدة واحدة (كحزمة واحدة) عبر الشبكة وقلنا ان افضل وسيلة لعمل ذلك هي باحتواء هذه البيانات في Class ومن ثم تحويل تلك البيانات الى Byte Array لكي يسهل لنا التعامل معها ونقلها عبر الشبكة. الآن ماذا لو اردنا نقل كائن (فئة) مثلا نقل Class عبر الشبكة طبعا مع محتوياتها لكن بدون الحاجة لتحويل بياناتها الى حزمة واحدة وبدون الحاجة الى معرفة اطوال البيانات وإرسالها !! كيف ذلك ؟ الحل هي بجعل الClass يمتلك خاصية ال Serialize,وذلك لكي نتمكن من تحويلها من كائن الى Stream Byte ونقلها عبر الشبكة. اذا كيف نجعل الClass يمتلك خاصية الSerialize؟ (سنتطرق لها لاحقا ان شاء الله) وما هي الSerialize؟ الSerialize هي عملية تحويل كائن الى سلسلة من البايتات وخزنها في Stream ومن ثم كتابتها اما على ملف او لارسالها عبر الشبكة او خزنها في قاعدة البيانات. وفرت لنا ال.NET فئتين للتعامل مع الSerialize الاول : Binary Formatter ضمن مجال الاسماء System.Runtime.Serialization.Formatters.Binary يقوم هذا الكلاس بتحويل الكائن الى Binary Encoding أي يقوم بعمل Serialize للكلاس عن طريق دالة الSerialize الى Stream اما لخزنها على القرص الصلب على شكل ملف bin او لنقلها عبر الشبكة. الثاني : XmlSerializer ضمن مجال الاسماء System.Xml.Serialization يقوم هذا الكلاس بتحويل الكائن الى XML Encoding عن طريق ايضا دالة الSerialize الى Stream اما لخزنها على شكل XML او نقلها عبر الشبكة . ملاحظة// الملف الناتج من الSerialize يحتوي على البيانات التي عملنا لها Serialize + معلومات حول نوعية الكائن يتضمن (assembly name, culture, and version). هنالك ثلاث متطلبات لعمل الSerialization 1-كائن لعمل Serialize لها. 2-Stream لاحتواء الكائن المسلسل (Serialized Object). 3-نوع الFormat المستخدم لعمل Serialize للكائن (Binary or Xml). في هذا الموضوع ستكون الامثلة باستخدام الBinary Formatter وإذا اردت استخدام الXmlSerializer فقط استبدل مجال الاسماء مع اسم الكلاس ونوع الخزن (الامتداد) حيث يكون على شكل XML. المثال الاول : عمل Serialize لكائن وكتابتها على ملف ثم استرجاع محتوى الكائن عن طريق الDeserialize PHP كود : using System; الكود بسيط ان شاء الله ومفهوم وليس هنالك داع لشرحها ,وتستطيع ارسالها عبر الشبكة عن طريق عمل Serialize للObject الى الNetworkStream. المثال الثاني : سنقوم في هذا المثال بعمل Serialize ل Classو ارسالها عبر الشبكة ومن ثم استرجاعها عن طريق الDeserialize ملاحظة// لكي يعمل الSerialized Class في الطرفين يجب ان نجعلها على شكل ملف مرجعي DLL ونقوم باستدعائها في كلا الجهتين. ملاحظة// لعمل ملف مرجعي DLL يمكنك مراجعة هذا الموضوع: انشاء ملف dll بلغة C# الموجود موقعه في التوقيع [COLOR="#A52A2A"] اولا : نقوم ببناء Class Library كما اسلفنا طبعا يمكنك اختيار اسم المشروع بأي اسم آخر ونعطيه خاصية الSerialize هكذا:[/COLOR] PHP كود : using System; خاصية الSerialize [Serializable] الذي اعطيناها للClass يجعل من الClass قابل للكتابة والقراءة سواء الى ملف في القرص الصلب او الى Stream. عندما نقوم بتنفيذ المشروع سينتج لنا ملف DLL في مخرجات المشروع (مجلدDebug ). الان نقوم بنسخ هذا الملف و وضعها في مجلد الDebug للمرسل والمستلم ومن ثم نقوم بإضافته كمرجع لكلا الطرفين عن طريق الAdd References ومن ثم استدعائها عن طريق الusing لكي نستطيع استخدام الSerialized Class في المشروع. برنامج المرسل PHP كود : using System; اهم ما نستطيع ملاحظته في طرف المرسل هي في هذه الاسطر PHP كود : //Creating a new instance of class BinaryFormatter في السطر الاول قمنا بإنشاء كائن جديد من نوع BinaryFormatter وفي السطر الثاني عملنا Serialize للكائن المراد ارساله الى Stream عن طريق دالة الSerialize للكائن BinaryFormatter لإرسالها الى الطرف المستقبل. برنامج المستقبل PHP كود : using System; الملاحظة المهمة في هذه الجهة تكمن ايضا في سطرين PHP كود : //Creating a new instance of class BinaryFormatter في السطر الاول ايضا قمنا بإنشاء كائن من نوع BinaryFormatter ثم في السطر الثاني استرجعنا البيانات المرسلة عن طريق دالة الDeserialize للكائن BinaryFormatter من الStream الى الكائن SerializeStdInfo. [COLOR="#A52A2A"]وأخيرا اترك لكم اكتشاف الاختلاف بأنفسكم بين برنامجي المرسل والمستقبل في هذا الموضوع وبرنامجي المرسل والمستقبل في موضوع ال Moving Complex Objects Across The Network ملاحظة: مثالي المرسل والمستقبل في المرفقات وفي الختام نحمد الله ونشكره لتوفيقه ايانا لكتابة هذا الموضوع والغاية هي افادة كل طالب علم ان شاءا لله ونصلي على رسوله الكريم محمد صلى الله عليه وآله وسلم ونسألكم الدعاء لي ولوالدي ولكل مسلم محتاج [/COLOR] Moving Complex Objects Across The Net Using Serlialization - @@أبورائد@@ - 23-03-13 السلام عليكم ورحمة الله وبركاته ما شاء الله تبارك الله لا قوة إلا بالله أشكرك أخي الأستاذ سجــّــــــــــــــــــــــــــــــاد ربنا يزيدك من فضله السلام عليكم ورحمة الله وبركاته Moving Complex Objects Across The Net Using Serlialization - Sajad - 23-03-13 وعليكم السلام ورحمة الله اخي العزيز شكرا على المرور والتعليق بارك الله فيك اتمنى ان تستفيد من الموضوع ان شاءالله سأحول الامثلة الى لغة الvb.net وسأرفقها في هذا الموضوع Moving Complex Objects Across The Net Using Serlialization - Sajad - 23-03-13 السلام عليكم الامثلة بلغة الvb.net في المرفقات بالتوفيق ان شاءالله |