الفرق بين المراجعتين لصفحة: «Ruby/Marshal»
لا ملخص تعديل |
لا ملخص تعديل |
||
سطر 1: | سطر 1: | ||
تحوّل المكتبة <code>Marshal</code> مجموعات من كائنات روبب إلى سلاسل بتات (byte stream)، مما يسمح بتخزينها خارج البرنامج النصي النشط حاليًا. ثم يمكن بعد ذلك قراءة تلك البيانات وإعادة إنشاء الكائنات الأصلية. | تحوّل المكتبة <code>Marshal</code> مجموعات من كائنات روبب إلى سلاسل بتات (byte stream)، مما يسمح بتخزينها خارج البرنامج النصي النشط حاليًا. ثم يمكن بعد ذلك قراءة تلك البيانات وإعادة إنشاء الكائنات الأصلية. | ||
تحتوي البيانات المرصوفة (Marshaled data) على أرقام إصدار رئيسية وثانوية مخزنة مع معلومات الكائن. في الاستخدام العادي ، تُحمّل فقط البيانات التي لها نفس رقم الإصدار الرئيسي، ورقم إصدار ثانوي مساوٍ أو أقل. | تحتوي البيانات المرصوفة (Marshaled data) على أرقام إصدار رئيسية وثانوية مخزنة مع معلومات الكائن. في الاستخدام العادي ، تُحمّل فقط البيانات التي لها نفس رقم الإصدار الرئيسي، ورقم إصدار ثانوي مساوٍ أو أقل. وفي حال ضبط قيمة الراية "<code>verbose</code>" (عادةً باستخادم <code>-d</code> أو <code>-v</code> أو <code>-w</code> أو <code>-verbose</code>) يجب أن تتطابق الأرقام الرئيسية والثانوية تمامًا. إصدارات <code>Marshal</code> مستقلة عن إصدار روبي المستخدم. يمكنك استخلاص رقم الإصدار عن طريق قراءة أول بتّتين من البيانات المشحونة.<syntaxhighlight lang="ruby"> | ||
str = Marshal.dump("thing") | str = Marshal.dump("thing") | ||
RUBY_VERSION #=> "1.9.0" | RUBY_VERSION #=> "1.9.0" | ||
سطر 8: | سطر 8: | ||
</syntaxhighlight>لا يمكن تفريغ بعض الكائنات: في حال محاولة تفريغ كائنات تتضمن ارتباطات (bindings) أو إجراءات (procedure) أو توابع، أو كائنات <code>IO</code>، أو كائنات أحادية (singleton)، فسيطلق الخطأ <code>[[Ruby/TypeError|TypeError]]</code>. | </syntaxhighlight>لا يمكن تفريغ بعض الكائنات: في حال محاولة تفريغ كائنات تتضمن ارتباطات (bindings) أو إجراءات (procedure) أو توابع، أو كائنات <code>IO</code>، أو كائنات أحادية (singleton)، فسيطلق الخطأ <code>[[Ruby/TypeError|TypeError]]</code>. | ||
إن كنت تريد تسلسلا (serialization) | إن كنت تريد تسلسلا (serialization) مخصصًا (على سبيل المثال ، إذا كنت تريد إجراء التسلسل وفق تنسيق معين) ، أو إذا كان الصنف يحتوي كائنات غير قابلة للتسلسل، فيمكنك إعداد قواعد التسلسل الخاصة بك. | ||
هناك طريقتان للقيام بذلك، يمكن للكائنات | هناك طريقتان للقيام بذلك، يمكن للكائنات أن تعرّف إما <code>marshal_dump</code> و <code>marshal_load</code> أو <code>_dump</code> و <code>_load</code>. سيكون لـ <code>marshal_dump</code> الأولوية على <code>_dump</code> في حال تعريف كليهما. قد يُنتج <code>marshal_dump</code> سلاسل نصية أصغر. | ||
==اعتبارات أمنية== | ==اعتبارات أمنية== | ||
يمكن للتابع <code>[[Ruby/Marshal/load|load]]</code> فك تسلسل (deserialize) تقريبا أي صنف مُحمّل في عمليات روبي. في العديد من الحالات، يمكن أن يؤدي ذلك إلى تنفيذ التعليمات البرمجية عن بُعد، إن حُملت | يمكن للتابع <code>[[Ruby/Marshal/load|load]]</code> فك تسلسل (deserialize) تقريبا أي صنف مُحمّل في عمليات روبي. في العديد من الحالات، يمكن أن يؤدي ذلك إلى تنفيذ التعليمات البرمجية عن بُعد، إن حُملت البيانات المرصوفة (Marshal data) من مصدر غير موثوق به. | ||
ونتيجة لذلك ، | ونتيجة لذلك ، فالتابع <code>[[Ruby/Marshal/load|load]]::</code> ليس مناسبًا ليكون تنسيق تسلسل عام، ويجب ألا يتم تبديد (unmarshal) البيانات المُدخلة من قبل المستخدم أو غيرها من البيانات غير الموثوقة. | ||
إذا كنت تريد فك تسلسل (deserialize) البيانات غير الموثوقة، فاستخدم JSON أو تنسيق تسلسل | إذا كنت تريد فك تسلسل (deserialize) البيانات غير الموثوقة، فاستخدم JSON أو تنسيق تسلسل آخر لا يمكنه أن يحمّل إلا الأنواع "البدائية" البسيطة، مثل السلاسل النصية والمصفوفات والقواميس وما إلى ذلك. لا تسمح أبدًا لمدخلات المستخدم أن تحدد أنواع عشوائية لفك التسلسل. | ||
== marshal_dump و marshal_load == | == marshal_dump و marshal_load == | ||
سطر 45: | سطر 45: | ||
استخدم التابعين <code>_dump</code> و <code>_load</code> عندما تريد تحديد الكائن الذي تود استعادته بنفسك. | استخدم التابعين <code>_dump</code> و <code>_load</code> عندما تريد تحديد الكائن الذي تود استعادته بنفسك. | ||
عند تفريغ كائن، يُستدعى التابع <code>_dump</code> مع تمرير عدد صحيح إليه إشارة إلى العمق الأقصى للكائنات التى ستُفرّغ (القيمة <code>-1</code>تعني | عند تفريغ كائن، يُستدعى التابع <code>_dump</code> مع تمرير عدد صحيح إليه إشارة إلى العمق الأقصى للكائنات التى ستُفرّغ (القيمة <code>-1</code>تعني تعطيل التحقق من العمق). يجب أن يعيد التابع <code>_dump</code> سلسلة نصية تحتوي على المعلومات الضرورية لإعادة إنشاء الكائن. | ||
يأخذ الصنف <code>method_load</code> سلسلة نصية ويستخدمها لإعادة كائن من نفس الصنف. | يأخذ الصنف <code>method_load</code> سلسلة نصية ويستخدمها لإعادة كائن من نفس الصنف. | ||
سطر 65: | سطر 65: | ||
end | end | ||
end | end | ||
</syntaxhighlight>لما كان التابع <code>[[Ruby/Marshal/dump|dump]]</code> يعيد سلسلة نصية، يمكنك جعل <code>have_dump</code> | </syntaxhighlight>لما كان التابع <code>[[Ruby/Marshal/dump|dump]]</code> يعيد سلسلة نصية، يمكنك جعل التابع <code>have_dump</code> يعيد سلسلة مرصوفة (Marshal string)، | ||
==توابع الصنف العامة (Public Class Methods)== | ==توابع الصنف العامة (Public Class Methods)== | ||
===[[Ruby/Marshal/dump| التابع | ===[[Ruby/Marshal/dump| التابع dump]]=== | ||
يُسلسل (Serializes) | يُسلسل (Serializes) التابع <code>dump</code> الوسيط المعطى <code>obj</code> (انظر فقرة البنية العام) وجميع الكائنات المنحدرة منه (descendant objects). في حال تمرير كائن <code>IO</code>، فستُكتب البيانات المُسَلسلة فيه، وإلا فستُعاد البيانات كسلسلة نصية (<code>String</code>). | ||
===[[Ruby/Marshal/load| التابع | ===[[Ruby/Marshal/load| التابع load]]=== | ||
يعيد | يعيد التابع <code>load</code> نتيجة تحويل البيانات المُسلسلة (serialized) في المصدر إلى كائن روبي (ربما مع كائنات ثانوية [subordinate objects] مرتبطة به). قد يكون المصدر إما كائنا من الصنف <code>IO</code>، أو كائنًا يستجيب إلى التابع <code>to_str</code>. في حال تمرير الوسيط <code>proc</code>، فسيتم تمرير كل الكائنات إلى <code>proc</code> أثناء فك تسلسلها (deserialisation). | ||
===[[Ruby/Marshal/restore| التابع | ===[[Ruby/Marshal/restore| التابع restore]]=== | ||
يعيد | يعيد التابع <code>restore</code> نتيجة تحويل البيانات المُسلسلة (serialized) في المصدر إلى كائن روبي (ربما مع كائنات ثانوية [subordinate objects] مرتبطة به). قد يكون المصدر إما كائنا من الصنف <code>IO</code>، أو كائنًا يستجيب إلى التابع <code>to_str</code>. في حال تمرير الوسيط <code>proc</code>، فسيتم تمرير كل الكائنات إلى <code>proc</code> أثناء فك تسلسلها (deserialisation). | ||
==مصادر<span> </span>== | ==مصادر<span> </span>== | ||
*[http://ruby-doc.org/core-2.5.1/ | *[http://ruby-doc.org/core-2.5.1/Marshal.html قسم الصنف Marshal في توثيق روبي الرسمي.]<noinclude>{{DISPLAYTITLE: صفحة الصنف <code>Marshal</code> في روبي}}</noinclude> | ||
[[تصنيف: Ruby]] | [[تصنيف: Ruby]] | ||
[[تصنيف: Marshal]] | [[تصنيف: Marshal]] |
مراجعة 17:53، 24 أكتوبر 2018
تحوّل المكتبة 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
سلاسل نصية أصغر.
اعتبارات أمنية
يمكن للتابع load
فك تسلسل (deserialize) تقريبا أي صنف مُحمّل في عمليات روبي. في العديد من الحالات، يمكن أن يؤدي ذلك إلى تنفيذ التعليمات البرمجية عن بُعد، إن حُملت البيانات المرصوفة (Marshal data) من مصدر غير موثوق به.
ونتيجة لذلك ، فالتابع load::
ليس مناسبًا ليكون تنسيق تسلسل عام، ويجب ألا يتم تبديد (unmarshal) البيانات المُدخلة من قبل المستخدم أو غيرها من البيانات غير الموثوقة.
إذا كنت تريد فك تسلسل (deserialize) البيانات غير الموثوقة، فاستخدم JSON أو تنسيق تسلسل آخر لا يمكنه أن يحمّل إلا الأنواع "البدائية" البسيطة، مثل السلاسل النصية والمصفوفات والقواميس وما إلى ذلك. لا تسمح أبدًا لمدخلات المستخدم أن تحدد أنواع عشوائية لفك التسلسل.
marshal_dump و marshal_load
عند تفريغ (dumping) كائن سيتم استدعاء التابع marshal_dump
. يجب أن يعيد التابع marshal_dump
نتيجة تحتوي على المعلومات الضرورية لـ marshal_load
لإعادة إنشاء الكائن. النتيجة يمكن أن تكون أي كائن.
عند تحميل كائن تم تفريغه باستخدام marshal_dump
، يتم أولاً تحديد الكائن، ثم يُستدعى marshal_load
وتُمرّر إليه النتيجة المُعادة من marshal_dump
. يجب أن يعيد التابع marshal_load
إنشاء الكائن انطلاقًا من المعلومات المُتضمنة في النتيجة.
مثال:
class MyObj
def initialize name, version, data
@name = name
@version = version
@data = data
end
def marshal_dump
[@name, @version]
end
def marshal_load array
@name, @version = array
end
end
_dump و _load
استخدم التابعين _dump
و _load
عندما تريد تحديد الكائن الذي تود استعادته بنفسك.
عند تفريغ كائن، يُستدعى التابع _dump
مع تمرير عدد صحيح إليه إشارة إلى العمق الأقصى للكائنات التى ستُفرّغ (القيمة -1
تعني تعطيل التحقق من العمق). يجب أن يعيد التابع _dump
سلسلة نصية تحتوي على المعلومات الضرورية لإعادة إنشاء الكائن.
يأخذ الصنف method_load
سلسلة نصية ويستخدمها لإعادة كائن من نفس الصنف.
مثال:
class MyObj
def initialize name, version, data
@name = name
@version = version
@data = data
end
def _dump level
[@name, @version].join ':'
end
def self._load args
new(*args.split(':'))
end
end
لما كان التابع dump
يعيد سلسلة نصية، يمكنك جعل التابع have_dump
يعيد سلسلة مرصوفة (Marshal string)،
توابع الصنف العامة (Public Class Methods)
التابع dump
يُسلسل (Serializes) التابع dump
الوسيط المعطى obj
(انظر فقرة البنية العام) وجميع الكائنات المنحدرة منه (descendant objects). في حال تمرير كائن IO
، فستُكتب البيانات المُسَلسلة فيه، وإلا فستُعاد البيانات كسلسلة نصية (String
).
التابع load
يعيد التابع load
نتيجة تحويل البيانات المُسلسلة (serialized) في المصدر إلى كائن روبي (ربما مع كائنات ثانوية [subordinate objects] مرتبطة به). قد يكون المصدر إما كائنا من الصنف IO
، أو كائنًا يستجيب إلى التابع to_str
. في حال تمرير الوسيط proc
، فسيتم تمرير كل الكائنات إلى proc
أثناء فك تسلسلها (deserialisation).
التابع restore
يعيد التابع restore
نتيجة تحويل البيانات المُسلسلة (serialized) في المصدر إلى كائن روبي (ربما مع كائنات ثانوية [subordinate objects] مرتبطة به). قد يكون المصدر إما كائنا من الصنف IO
، أو كائنًا يستجيب إلى التابع to_str
. في حال تمرير الوسيط proc
، فسيتم تمرير كل الكائنات إلى proc
أثناء فك تسلسلها (deserialisation).