صفحة الصنف Marshal
في روبي
تحوّل المكتبة Marshal
مجموعات من كائنات روبب إلى سلاسل بتات (byte stream)، مما يسمح بتخزينها خارج البرنامج النصي النشط حاليًا. ثم يمكن بعد ذلك قراءة تلك البيانات وإعادة إنشاء الكائنات الأصلية.
تحتوي البيانات المشحونة (Marshaled data) على أرقام إصدار رئيسية وثانوية مخزنة مع معلومات الكائن. في الاستخدام العادي ، تُحمّل فقط البيانات التي لها نفس رقم الإصدار الرئيسي، ورقم إصدار ثانوي مساوٍ أو أقل. في حال ضبط قيمة الراية "verbose
" (عادةً باستخادم -d
أو -v
أو -w
أو -verbose
) يجب أن تتطابق الأرقام الرئيسية والثانوية تمامًا. إصدارات Marshal
مستقلة عن أرقام إصدار روبي المستخدم. يمكنك استخلاص رقم الإصدار عن طريق قراءة أول بتّتين من البيانات المشحونة.
str = Marshal.dump("thing")
RUBY_VERSION #=> "1.9.0"
str[0].ord #=> 4
str[1].ord #=> 8
لا يمكن تفريغ بعض الكائنات: في حال محاولة تفريغ كائنات تتضمن ارتباطات (bindings) أو إجراءات (procedure) أو توابع، أو كائنات IO
، أو كائنات أحادية (singleton)، فسيطلق الخطأ TypeError
.
إن كنت تريد تسلسلا (serialization) خاصا بالصنف خاصتك (على سبيل المثال ، إذا كنت تريد إجراء التسلسل وفق تنسيق معين) ، أو إذا كان الصنف يحتوي على كائنات غير قابلة للتسلسل، فيمكنك إعداد قواعد التسلسل الخاصة بك.
هناك طريقتان للقيام بذلك، يمكن للكائنات تعريف إما marshal_dump
و marshal_load
أو _dump
و _load
. سيكون لـ marshal_dump
الأولوية على _dump
في حال تعريف كليهما. قد يُنتج marshal_dump
سلاسل نصية أصغر.
اعتبارات أمنية
حسب التصميم ، يمكن تحميل loaderize تقريبا أي فئة تحميلها في عملية Ruby. في العديد من الحالات ، يمكن أن يؤدي ذلك إلى تنفيذ التعليمات البرمجية عن بُعد في حالة تحميل بيانات Marshal من مصدر غير موثوق به.
ونتيجة لذلك ، لا يكون حمل "::" مناسبًا كتنسيق التسلسل للأغراض العامة ويجب ألا يتم أبدًا تجاهل إدخال المستخدم الذي تم توفيره أو البيانات الأخرى غير الموثوق بها.
إذا كنت بحاجة إلى إلغاء تسلسل البيانات غير الموثوقة ، فاستخدم JSON أو تنسيقًا آخر للتسلسل يمكنه فقط تحميل أنواع "بدائية" بسيطة مثل String و Array و Hash وما إلى ذلك. لا تسمح أبدًا لمدخلات المستخدم بتحديد أنواع تعسفية لإلغاء التسلسل.
marshal_dump و marshal_load¶ ↑
عند تفريغ كائن سيتم استدعاء الأسلوب marshal_dump. يجب أن يقوم marshal_dump بإرجاع نتيجة تحتوي على المعلومات الضرورية لـ marshal_load لإعادة تكوين الكائن. يمكن أن تكون النتيجة أي كائن.
عند تحميل كائن تم تفريغه باستخدام marshal_dump يتم أولاً تخصيص الكائن ثم يتم استدعاء marshal_load مع النتيجة من marshal_dump. يجب على marshal_load إعادة إنشاء الكائن من المعلومات الموجودة في النتيجة.
LocalJumpError: no block given (yield)
توابع الصنف العامة (Public Class Methods)
التابع ::dump
يُسلسل (Serializes) ظظظ الوسيط المعطى obj ططط وجميع الكائنات المنحدرة (descendant objects). في حال تمرير كائن IO، فستُكتب البيانات المُسَلسلة فيه، وإلا فستُعاد البيانات كسلسلة نصية (String
). في حال تمرير limit، فسيقتصر عمل ظظظ على الكائنات الفرعية على العمق المحدد به. إذا كان limit سالباً، لن يتم إجراء أي تحقق للعمق.
التابع ::load
يعيد ظظظ نتيجة تحويل البيانات المُسلسلة (serialized) في المصدر إلى كائن في روبي (ربما مع كائنات ثانوية [subordinate objects] مرتبطة به). قد يكون المصدر إما نسخة من IO
، أو كائنًا يستجيب إلى to_str. في حال تمرير الوسيط proc، فسيتم تمرير كل الكائنات إلى proc، أثناء فك تسلسلها (deserialisation).
التابع ::restore
يعيد ظظظ نتيجة تحويل البيانات المُسلسلة (serialized) في المصدر إلى كائن في روبي (ربما مع كائنات ثانوية [subordinate objects] مرتبطة به). قد يكون المصدر إما كائنًا من الصنف IO
أو كائنًا يستجيب إلى to_str. في حال تمرير الوسيط proc ، فسيتم تمرير كل الكائنات إلى proc، أثناء فك تسلسلها (deserialisation).