السلام عليكم و رحمة الله تعالى و بركاته,,,
لعل من بين اللغات البرمجية المستعملة الآن هي XML المعرفة كـ Extensible Markup Language. لن أخوض في وضع تعريف لهذه اللغة لأن هناك العديد من المواقع و الكتب التي تقدم تعريفات و معلومات كاملة عنها و هذا رابط حيث ستجدون المعلومات التي تحتاجونها في الموضوع XML (Extensible Markup Language). المهم أن تقريبا لا تكاد تجد تقنية من التقنيات الجديدة لا تستعمل لغة XML و ما يهمنا هنا هو أحد استعمالاتها في لغات الدوت نت.
من منا نحن المبرمجين لم يحتج يوما لحفظ كائن من الذاكرة الحية إلى و حدة تخزين؟ الفكرة تبدو سهلة و لكن تطبيقها صعب, أليس كذلك؟ الجواب على هذين السؤالين جانب صغير واحد من الجوانب التي أثبتت XML جدارتها و فعاليتها فيه. لغات الدوت نت تتيح للمبرمج تحويل أي كائن من صيغته الثنائية العادية على الذاكرة الحية إلى صيغة مقروءة بلغة XML. لغة الدوت نت تضع رهن إشارتنا العديد السمات أو attributes لوضع علامة على كل متغير أو كائن داخل الكلاس لتعريف طريقة حفظه من الذاكرة الحية و استرجاعه من ملف على وحدة تخزين. و من بين هذه السمات :
XmlArrayAttribute : تعرف الكائن أو المتغير ليتم حفظه على شكل مصفوفة.
XmlAttributeAttribute : تعرف الكائن أو المتغير على أنه سمة للكائن المعرف بداخله.
XmlElementAttribute : تعرف الكائن أو المتغير على أنه عنصر من العناصر المكونة للكائن المعرف بداخله.
XmlEnumAttribute : تعرف المتغير ليتم حفظه كنوع enum.
XmlIgnoreAttribute : تضع علامة على الكائن أو المتغير ليتم تجاهله في مرحلة الحفظ.
XmlTextAttribute : تعرف الكائن أو المتغير ليتم حفظه كنص XML.
قبل البدء في التطبيق تجدر الإشارة إلى أن الكلاس XmlSerializer هي التي تتكلف بحفظ كائن على شكل ملف XML و السمات التي ذكرنا تساعدها في التعرف على كل كائن أو متغير و تقوم بحفظه بالشكل الذي نريد و الذي حددناه عن طريق السمة XML مباشرة قبل تعريف الكائن أو المتغير. فمثلا الكود التالي يعرف لنا s على أنه متغير من نوع string سيتم حفظه على أنه عنصر من عناصر الكائن الحاوي له.
<XmlElement()> Public s As String
الآن و بعد أن تعرفنا على السمات المعرفة لعناصر كلاس من متغيرات و كائنات دعونا نطبق بعضها على الكلاس Test حتى تصبح الكائنات المنشئة منها قابلة للحفظ و الإسترجاع بكل سهولة. لعدم الإطالة و التعقيد سنستعمل فقط السمات XmlElementAttribute و XmlArrayAttribute. يمكنكم تجريب باقي السمات لملاحظة الفرق في ملف XML نتيجة عملية الحفظ. لنفترض أنه لدينا في مشروع كلاس معرفة كالتالي :
Public Class Test Public string_element As String Public int_element As Integer Public double_element As Integer Public datetime_element As DateTime Public array_elements(3) As String Public ot As New OtherTest() Public Sub InitData() string_element = "string" int_element = 123456789 double_element = Math.PI datetime_element = DateTime.Now array_elements(0) = "one" array_elements(1) = "two" array_elements(2) = "tree" array_elements(3) = "four" End Sub End Class
عندنا ثلاثة أنواع من بنية البيانات في الكلاس أعلاه. النوع الأول نوع عادي مم نستعمله في حياتنا اليومية العملية و سنعرف كل واحد منها بالسمة XmlElementAttribute. النوع الثاني هو المصفوفة array_element التي سنعرفها بالسمة XmlArrayAttribute. النوع الثالث هو الكائن ot للكلاس OtherTest الذي سنعرفه كما نعرف بنية البيانات الأساسية بشرط أن الكائنات المعرفة داخله تكون هي الأخرى معرفة بسمات XML. في الأخير ستكون النتيجة كالتالي :
Public Class Test <XmlElement()> _ Public string_element As String <XmlElement()> _ Public int_element As Integer <XmlElement()> _ Public double_element As Integer <XmlElement()> _ Public datetime_element As DateTime <XmlArray()> _ Public array_elements(3) As String <XmlElement()> _ Public ot As New OtherTest() Public Sub InitData() string_element = "string" int_element = 123456789 double_element = Math.PI datetime_element = DateTime.Now array_elements(0) = "one" array_elements(1) = "two" array_elements(2) = "tree" array_elements(3) = "four" End Sub End Class
الآن يمكننا دراسة الكود الذي سينشئ لنا نسخة XML من الكائن الذي أنشأناه من الكلاس المبينة أعلاه و يسجلها على ملف لنتمكن من استرجاع الكائن متى شئنا. الكود بسيط للغاية و لا يتعدى بضعة أسطر :
Dim t As new Test() t.InitData() Dim strm As Stream = File.Open(fileName, FileMode.Create) Dim ser As New XmlSerializer(t.GetType()) ser.Serialize(strm, t) strm.Close()
الجملة الأولى تنشئ لنا الملف الذي بداخله سيقوم الكائن ser المنشأ من الكلاس XmlSerializer, سيقوم بإنشاء نص XML به كل المعلومات الضرورية لاسترجاع الكائن في أي زمان و على أي حاسوب. الجملة الثانية ننشئ الكائن ser و نعرفه على نوع الكائن الذي نريد تحويله إلى نص XML. الجملة الثالثة تقوم بكتابة محتوى الكائن أي نص XML في الملف المفتوح. و ستكون النتيجة على الشكل التالي :
<?xml version="1.0"?> <Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" int_element="123456789"> <string_element>string</string_element> <double_element>3</double_element> <datetime_element>2009-08-26T12:07:08.545521+00:00</datetime_element> <array_elements> <string>one</string> <string>two</string> <string>tree</string> <string>four</string> </array_elements> <ot> <name>OtherTest object</name> <now>2009-08-26T12:07:08.3492445+00:00</now> </ot> </Test>
النتيجة تكون ملف يحتوي على نص XML به كل المعلومات عن الكائن الموجود بالذاكرة الحية. و هذا الملف سهل القراءة يمكن إرساله عبر الشبكات الداخلية و عبر الانترنت بكل سهولة و هنا تظهر فعالية XML. كما يمكن بسهولة تغيير محتوى النص XML حتى نتحكم بمحتوى الكائن المسترجع. و لاسترجاع الكائن من على الملف بوحدة التخزين إلى الذاكرة الحية نقوم بعكس العملية التي هي سهلة و بسيطة بساطة عملية الحفظ.
Dim strm As Stream = File.Open(fileName, FileMode.Open) Dim ser As New XmlSerializer(typeObj) Dim obj As Object = ser.Deserialize(strm) strm.Close()
كود استرجاع الكائن شبيه تماما بكود الحفظ إلا أننا في هذه الحالة سنقوم بفتح الملف للقراءة و نقوم بالمناداة على الدالة Deserialize التي ستنشئ لنا كائنا نسخة طبق الأصل من الكائن الذي قمنا بحفظه. بقي أن نحول الكائن obj إلى نوع الكائن الأصلي ألا و هو Test.
نقطة أخيرة, هي أن كل الكائنات و المتغيرات التي نريد أن يتم حفظها مع الكائن الحاوي لها يجب أن تكون معرفة على أنها Public و كذل الأمر بالنسبة للكائن الحاوي و الموديل كذلك.
أتمنى أن يكون هذا الموضوع مفيدا. و أتمنى أن أكون قد أوصلته بالشكل الذي يضمن الفهم الجيد.
في الملف المرفق مع هذا الموضوع مشروع صغير يمكن تتبع تنفيذه جملة جملة عن طريق الضغط على الزر F8 للمزيد من الفهم. الملف فيه كذلك كود الجزء الثاني من هذا الموضوع. يتبع...
تحياتي...
