مقارنة بين Serialization و Marshaling

This article is available in English too, check it out here.

نظرة خاطفة

الدرس اليوم يقوم بشرح فكرة الـ Serialization وفكرة الـ Marshaling ويعقد المقارنات بين العمليتين وكيفية فك الإشكال والتشابه بين هذين المفهومين.

Serialization

السَّرْيَلة أو Serialization هي فكرة تحويل البيانات أو العناصر البرمجية إلى سلسلة من البيانات التي يمكن تخزينها في ملف أو في الذاكرة أو يمكن نقلها عبر الشبكة. وهذه السلسلة يمكن أن تكون في أي صيغة وأي شكل ولكن الأشهر أن تكون في صيغة XML أو Binary.

في بيئة الدوت نت، يمكنك مشاهدة عملية الـ Serialization في العديد من الأماكن منها قواعد البيانات ADO.NET، خدمات الإنترنت، و Remoting.

فعلى سبيل المثال، أثناء تعاملك مع قواعد البيانات والداتاسيت DataSet يمكنك استخدام الدالة WriteXml() لعمل سريلة Serialize للبيانات الموجودة في القاعدة وتحويلها إلى بيانات بصيغة XML وحفظها في ملف على الجهاز. لاحظ السطر التالي:

    ds.WriteXml("data.xml");

ولا تقتصر السريلة على قواعد البيانات فقط، بل تمتد إلى جميع العناصر. فيمكنك استخدام العناصر الموجودة في System.Runtime.Serialization لعمل سريلة لأي عناصر بيانات Data Structures موجودة. فمثلا إذا كان لدينا مصفوفة من العنصر التالي:

    public struct User
{
    public int id;
    public string name;
}

فيمكننا تحويلها (سريلتها) إلى صيغة XML لتصبح كالتالي مثلا:

<?xml version="1.0" encoding="utf-8"?>
<users>
    <user>
        <id>12</id>
        <name>Mark</name>
    </user>
    <user>
        <id>13</id>
        <name>Charles</name>
    </user>
    <user>
        <id>14</id>
        <name>John</name>
    </user>
</users>

أيضا تظهر عملية الـ Serialization بشكل واضح في خدمات الإنترنت Web/WCF Services. فعند اتصالك مع أي خدمة إنترنت وإجراء تحاور معها (النداء على الدوال، مشاركة البيانات، إلخ) فإن جميع البيانات المرسلة إلى جهازك تسريل إلى صيغة XML كي تستطيع الانتقال بسهولة خلال الشبكة، أيضا فإن أي رد من هذه الخدمة يسريل إلى XML كي يستطيع الوصول إلى النظام عندك.

إذا فالسيريلة Serialization هي عصب خدمات الإنترنت وعصب Remoting (حيث أنه يجب الاتفاق بين المرسل والمستقبل على نفس الصيغة ونفس التركيب للبيانات التي تسريل) وعصب قواعد البيانات ADO.NET (البيانات تسجل داخليا في صيغة XML) ولا يمكن الاستغناء عنها أبدا في العديد من التقنيات سواء الحديثة أو القديمة.

إذا فعملية السريلة تسمى Serialization وهي عملية تحويل البيانات أو العناصر البرمجية إلى سلسلة من البيانات التي يمكن تخزينها في وسائط التخزين.

عكس هذه العملية (عملية السريلة) عكسها عملية فك السريلة Deserialization وهي عملية تحويل هذه البيانات (المصاغة كـ XML أو Binary أو غيرها) إلى نوعها أو شكلها أو صيغتها الأصلية.

فعلى سبيل المثال، بعد قيامنا بسريلة الـ DataSet يمكننا استرجاع هذه البيانات أي تحويل ملف الـ XML إلى DataSet مرة أخرى. لاحظ الكود التالي:

DataSet ds;
ds.ReadXml("data.xml");

أيضا فعند تعاملك مع خدمات الإنترنت فإنك عند قيامك بإرسال بيانات فإن الدوت نت يقوم بسريلتها (تحويلها) إلى XML لإرسالها، ثم يفك سريلتها Deserialize ويحولها إلى شكلها الأصلي (مثلا مصفوفة بيانات أو تركيب Structure أو تصنيف Class ونحوها) عند استلامها من خدمة الإنترنت هذه.

أخيرا فإنك ربما لاحظت شهرة السيريلة بصيغة XML وذلك لأن بيانات XML هي بيانات نصية فيمكن نقلها بسهولة عبر الشبكة ويسهل التعامل معها. بعكس البيانات الثنائية Binary فإنها في الأغلب تُرفَض من قِبَل إما المستلم أو المرسل لأنها ربما تحوي برامج ضارة بالجهاز.

Marshaling

الـ Marshaling هي عملية تحدث أثناء الاتصال بين بيئة الدوت نت وأي بيئة أو تقنية أخرى (مثلا مكتبات الويندوز Windows API.) الـ Marshaling هي عملية تحويل البيانات من بيئة الدوت نت لتصبح مقروءة في هذه البيئة الأخرى أو العكس، تحويل البيانات من هذه البيئة الأخرى لتصبح مقروءة في بيئة الدوت نت.

لا يخفى عليك أنه في معجم مبرمجي الدوت نت أن كود الدوت نت يسمى الكود المدار Managed Code وذلك لأن بيئة الدوت نت (تحديدا خدمة CLR) هي التي تتحكم في كيفية عمل الكود وتنفيذه. من الناحية الأخرى، فإن أي تقنية أو كود آخر عدا الدوت نت يسمى الكود الغير مدار Unmanaged Code.

إذا فعملية الـ Marshaling هي عملية تحويل البيانات الخاصة بالكود المدار Managed Code (كود الدوت نت) لتصبح مقروءة في الكود الغير مدار Unmanaged Code (الكود عدا الدوت نت) والعكس.

ولماذا تحتاج إلى عملية التحويل Marshaling؟ كما تعرف لا يوجد توافقية بين الدوت نت والكود الغير مدار Unmanaged Code. فمثلا أنت لا تستطيع النداء على أي من دوال الويندوز من خلال الدوت نت مباشرة ولكن تحتاج إلى إنشاء وسيط يسمح لك بالاتصال مع مكتبات الويندوز. وأيضا فإنك لا تستطيع نقل البيانات بشكل مباشر بين بيئة الدوت نت والبيئة الأخرى. وهذا لأن نظام بيئة الدوت نت وطريقة التعامل معها وأنظمة البيانات فيها تختلف عن هذه التقنية الأخرى.

فمثلا، في برمجة الويندوز فإنه هناك عناصر بيانات من نوع BOOL. إذا نظرنا في بيئة الدوت نت فلن نجد عنصر بيانات من هذه النوع ولكن نجد شبيه أو مقابل له وهو System.Boolean. إذا فيمكننا عمل عملية التحويل Marshaling بين الـ BOOL و System.Boolean. ومثلا النوع LPCTSTR غير موجود في بيئة الدوت نت. ولكن يمكننا إيجاد بديل له أو عمل Marshaling بينه LPCTSTR وبين System.String أو مصفوفة System.Char في بيئة الدوت نت.

إذا فعملية التحويل Marshaling هي عملية إيجاد طريقة لربط أنواع البيانات بين الدوت نت والتقنيات الأخرى عن طريق إيجاد بدائل لأنواع البيانات في التقنيات الأخرى، إيجادها في بيئة الدوت نت.

وجه الشبه

بعد قراءتك لما سبق فأنت بالتأكيد أصبحت لا تعتقد أن هناك أي وجه مقارنة بين عملية السريلة Serialization وعملية التحويل Marshaling. إذا فلماذا عقدنا جلسة مقارنة مع العلم أنه ليس هناك أي وجه شبه؟!

بالتأكيد أخطأنا كثيرا في تقدير أنه ليس هناك أوجه شبه بين السريلة Serialization والتحويل Marshaling! فأحيانا يصبح التشابه كثيرا لدرجة أنه تصبح لفظتي السريلة Serialization والتحويل Marshaling مترادفتان لمعنى واحد كما في بايثون Python فإنهما يرمزان إلى عملية واحدة وهي عملية تحويل تحدث في البيانات.

بما أننا كان اهتمامنا قائما على بيئة الدوت نت فسوف نعود إليها. فيمكننا إيجاد أن هناك تناقد كبير بين ما ذكرناه من وصف لعملية السريلة Serialization ولعملية التحويل Marshaling وبين تسمية التصنيف System.MarshalByRefObject والذي يستخدم لتحديد كيفية إرسال البيانات إما بالقيمة أو بالمرجعية في عملية Remoting والتي قلنا أنها عملية Serialization وليست Marshaling!

نقول أنه يجب علينا التدقيق أكثر في وصفنا لعمليتي Serialization و Marshaling وتعميم هذا الوصف بدلا من تخصيصه ببيئة الدوت نت.

عند رجوعنا لوصف Marshaling في Wikipedia سنجد أنه عملية الـ Marshaling بشكل عام تطلق على أي تحويلات تحصل في البيانات في الذاكرة. بينما عملية السريلة Serialization هي عملية تحويل معينة أكثر دقة وخصوصية في هذه البيانات. إذا فلفظ Marshaling هو لفظ عام يشمل عملية السريلة بينما Serialization هو لفظ خاص يطلق على عملية معينة.

لهذا فيمكننا القول أنه رغم أن هذا التصنيف System.MarshalByRefObject هو خاص بالدوت نت ولكن ربما جاءت سبب تسميته من نظرة متقدمة في مصطلح Marshaling. لهذا يمكننا القول أن الاسم MarshalByRefObject لم يخرج عن القاعدة فهي عملية سريلة Serialization كما قلنا ولكن استخدم لفظ أعم لوصفها.

رغم ذلك، فإنه ما عدا عملية الـ Remoting فجميع الأوضاع كما يرام. فعملية Serialization ترمز إلى عملية تحويل البيانات إلى صيغ أخرى. بينما عملية Marshaling ترمز إلى عملية تحويل البيانات لجعلها مقروءة في بيئات أخرى غير الدوت نت بدون تحويل صيغتها.

أخيرا

جدير بالذكر أن مصطلح Marshaling تم تطويره أولا بواسطة العالم Edward Waite Marshall في 1962 ثم بواسطة مؤسسة General Electric. أيضا، هناك سؤال، هل هي Marshaling أم Marshalling؟ إرجع في ذلك إلى أهل اللغة!

مواضيع مشابهة:

اخترنا لك:

أحدث المواضيع:

هل أعجبتك؟ شارك بها...