التسلسل

في مجال الحوسبة، تُعرف عملية التسلسل (أو ما يُسمى أيضًا بالتخزين في بايثون ) بأنها عملية تحويل بنية بيانات أو حالة كائن إلى تنسيق قابل للتخزين (مثل الملفات في أجهزة التخزين الثانوية ، ومخازن البيانات المؤقتة في أجهزة التخزين الأساسية) أو الإرسال (مثل تدفقات البيانات عبر شبكات الحاسوب ) وإعادة بنائها لاحقًا (ربما في بيئة حاسوبية مختلفة). [ 1 ] عند إعادة قراءة سلسلة البتات الناتجة وفقًا لتنسيق التسلسل، يمكن استخدامها لإنشاء نسخة طبق الأصل من الكائن الأصلي من حيث الدلالة. بالنسبة للعديد من الكائنات المعقدة، مثل تلك التي تستخدم المراجع بشكل مكثف ، فإن هذه العملية ليست مباشرة. لا يشمل تسلسل الكائنات أيًا من الطرق المرتبطة بها والتي كانت مرتبطة بها سابقًا.
تُسمى عملية تسلسل الكائن هذه أيضًا بالترتيب في بعض الحالات. [ 2 ] [ 3 ] [ 4 ] أما العملية المعاكسة، وهي استخراج بنية بيانات من سلسلة من البايتات، فتُسمى إلغاء التسلسل (وتُسمى أيضًا فك التسلسل أو فك الترتيب ).
في أجهزة معدات الشبكات، يُطلق على الجزء المسؤول عن التسلسل وإلغاء التسلسل عادةً اسم SerDes .
الاستخدامات
تشمل استخدامات التسلسل ما يلي:
- نقل البيانات عبر الأسلاك والشبكات ( المراسلة ).
- تخزين البيانات (في قواعد البيانات ، على محركات الأقراص الصلبة ).
- استدعاءات الإجراءات عن بعد ، على سبيل المثال، كما هو الحال في SOAP .
- توزيع الكائنات، خاصة في هندسة البرمجيات القائمة على المكونات مثل COM و CORBA وما إلى ذلك.
- الكشف عن التغيرات في البيانات المتغيرة مع مرور الوقت.
لكي تكون بعض هذه الميزات مفيدة، يجب الحفاظ على استقلالية البنية. على سبيل المثال، لتحقيق أقصى استفادة من التوزيع، ينبغي أن يكون الحاسوب الذي يعمل على بنية أجهزة مختلفة قادرًا على إعادة بناء تدفق البيانات المتسلسل بشكل موثوق، بغض النظر عن ترتيب البايتات . هذا يعني أن الإجراء الأبسط والأسرع المتمثل في نسخ تخطيط الذاكرة لبنية البيانات مباشرةً لا يمكن أن يعمل بشكل موثوق مع جميع البنى. إن تسلسل بنية البيانات بتنسيق مستقل عن البنية يعني تجنب مشاكل ترتيب البايتات ، وتخطيط الذاكرة، أو ببساطة اختلاف طرق تمثيل هياكل البيانات في لغات البرمجة المختلفة .
من سمات أي نظام تسلسلي أن ترميز البيانات تسلسلي بطبيعته، لذا فإن استخراج جزء من بنية البيانات التسلسلية يتطلب قراءة الكائن بأكمله من البداية إلى النهاية، ثم إعادة بنائه. في العديد من التطبيقات، تُعد هذه الخطية ميزة، لأنها تُمكّن من استخدام واجهات إدخال/إخراج بسيطة وشائعة لحفظ حالة الكائن وتمريرها. أما في التطبيقات التي تتطلب أداءً عاليًا، فقد يكون من المنطقي بذل جهد أكبر للتعامل مع بنية تخزين غير خطية أكثر تعقيدًا.
حتى على جهاز واحد، تُعدّ كائنات المؤشرات الأولية هشة للغاية بحيث لا يمكن حفظها، لأن الكائنات التي تشير إليها قد يُعاد تحميلها إلى موقع مختلف في الذاكرة. ولمعالجة هذه المشكلة، تتضمن عملية التسلسل خطوة تُسمى فك تبديل المؤشرات ، حيث تُحوّل مراجع المؤشرات المباشرة إلى مراجع بناءً على الاسم أو الموقع. أما عملية إلغاء التسلسل فتتضمن خطوة عكسية تُسمى تبديل المؤشرات .
بما أن عمليتي التسلسل وفك التسلسل يمكن تنفيذهما من خلال كود مشترك (على سبيل المثال، دالة Serialize في Microsoft Foundation Classes )، فمن الممكن لهذا الكود المشترك القيام بالعمليتين معًا، وبالتالي: 1) اكتشاف الاختلافات بين الكائنات التي يتم تسلسلها ونسخها السابقة، و2) توفير المدخلات اللازمة لاكتشاف الاختلافات التالية. ليس من الضروري إنشاء النسخة السابقة فعليًا، إذ يمكن اكتشاف الاختلافات أثناء التنفيذ، وهي تقنية تُسمى التنفيذ التفاضلي. يُعد هذا مفيدًا في برمجة واجهات المستخدم التي تتغير محتوياتها بمرور الوقت ، حيث يمكن إنشاء الكائنات الرسومية أو إزالتها أو تعديلها أو جعلها تستجيب لأحداث الإدخال دون الحاجة بالضرورة إلى كتابة كود منفصل للقيام بذلك.
العيوب
يؤدي التسلسل إلى كسر غموض نوع البيانات المجرد من خلال إمكانية كشف تفاصيل التنفيذ الخاصة. قد تنتهك التطبيقات البسيطة التي تُسلسل جميع أعضاء البيانات مبدأ التغليف . [ 5 ]
لمنع المنافسين من إنتاج منتجات متوافقة، غالبًا ما يحتفظ ناشرو البرامج الاحتكارية بتفاصيل تنسيقات تسلسل برامجهم كأسرار تجارية . بل إن بعضهم يتعمد إخفاء البيانات المُسلسلة أو حتى تشفيرها . ومع ذلك، تتطلب قابلية التشغيل البيني أن تكون التطبيقات قادرة على فهم تنسيقات التسلسل الخاصة بكل منها. لذا، تُعرّف بنى استدعاء الأساليب عن بُعد ، مثل CORBA، تنسيقات التسلسل الخاصة بها بالتفصيل.
تحاول العديد من المؤسسات، مثل الأرشيفات والمكتبات، تأمين أرشيفات النسخ الاحتياطي الخاصة بها في المستقبل - وخاصة نسخ قواعد البيانات - عن طريق تخزينها بتنسيق تسلسلي قابل للقراءة البشرية نسبياً .
تنسيقات التسلسل
أثرت تقنية Courier من شركة Xerox Network Systems في أوائل ثمانينيات القرن الماضي على أول معيار تم اعتماده على نطاق واسع. نشرت شركة Sun Microsystems معيار تمثيل البيانات الخارجية (XDR) في عام 1987. [ 6 ] يُعد XDR تنسيقًا مفتوحًا ، وقد تم توحيده كمعيار STD 67 (RFC 4506) من قبل IETF .
في أواخر التسعينيات، بدأت جهودٌ حثيثةٌ لتوفير بديلٍ لبروتوكولات التسلسل القياسية: استُخدمت لغة XML ، وهي مجموعة فرعية من SGML ، لإنتاج ترميز نصي قابل للقراءة البشرية . يُعدّ هذا الترميز مفيدًا للكائنات الدائمة التي يمكن قراءتها وفهمها من قِبل البشر أو نقلها إلى أنظمة أخرى بغض النظر عن لغة البرمجة. يُعاب عليه فقدان ميزة الترميز الأكثر إحكامًا القائم على تدفق البايتات، ولكن مع ازدياد سعات التخزين والنقل، أصبح حجم الملف أقل أهميةً مما كان عليه في بدايات الحوسبة. في العقد الأول من الألفية الثانية، شاع استخدام XML لنقل البيانات المهيكلة بشكل غير متزامن بين العميل والخادم في تطبيقات الويب Ajax . XML تنسيق مفتوح ومُعتمد كمعيار من قِبل W3C.
JSON هو بديل نصي خفيف الوزن لـ XML، ويُستخدم بشكل شائع للتواصل بين العميل والخادم في تطبيقات الويب. يعتمد JSON على بنية JavaScript، ولكنه مستقل عنها، ويدعمه العديد من لغات البرمجة الأخرى. وقد تم توحيد JSON وفقًا لمعايير STD 90 ( RFC 8259 )، و ECMA-404 ، و ISO/IEC 21778:2017 .
يُعدّ YAML مجموعةً فرعيةً شاملةً لـ JSON، ويتضمن ميزات إضافية مثل وسوم أنواع البيانات، ودعم هياكل البيانات الدورية، وبنية حساسة للمسافات البادئة، وأشكال متعددة لاقتباس البيانات العددية. YAML تنسيق مفتوح المصدر.
تُستخدم قوائم الخصائص في عملية التسلسل بواسطة أطر عمل NeXTSTEP و GNUstep و macOS و iOS . ولا تشير قائمة الخصائص ، أو p-list اختصارًا، إلى تنسيق تسلسل واحد، بل إلى عدة صيغ مختلفة، بعضها قابل للقراءة البشرية، وواحد ثنائي.
بالنسبة لمجموعات البيانات العلمية ذات الحجم الكبير، مثل بيانات الأقمار الصناعية ومخرجات النماذج العددية للمناخ أو الطقس أو المحيطات، تم تطوير معايير تسلسل ثنائية محددة، على سبيل المثال HDF و netCDF و GRIB الأقدم .
دعم لغات البرمجة
تدعم العديد من لغات البرمجة كائنية التوجه تسلسل الكائنات (أو أرشفة الكائنات ) بشكل مباشر، إما عبر عناصر برمجية مُبسّطة أو من خلال توفير واجهة قياسية لذلك. تشمل هذه اللغات Ruby و Smalltalk و Python و PHP و Objective-C و Delphi و Java وعائلة لغات .NET . كما تتوفر مكتبات تُضيف دعم التسلسل إلى اللغات التي تفتقر إلى دعم أصلي له.
لغة C ولغة C++
لا توفر لغتا C و C++ خاصية التسلسل كبنية عالية المستوى، لكنهما تدعمان كتابة أي من أنواع البيانات المضمنة ، بالإضافة إلى هياكل البيانات التقليدية ، كبيانات ثنائية. ولذلك، عادةً ما يكون من السهل كتابة دوال تسلسل مخصصة. علاوة على ذلك، فإن الحلول القائمة على المُصرّف، مثل نظام ODB ORM للغة C++ ومجموعة أدوات gSOAP للغتين C و C++، قادرة على إنتاج كود التسلسل تلقائيًا مع تعديلات طفيفة أو معدومة على تعريفات الفئات. ومن أطر عمل التسلسل الشائعة الأخرى Boost.Serialization [ 7 ] من إطار عمل Boost ، وإطار عمل S11n [ 8 ] ، وCereal [ 9 ] . كما يوفر إطار عمل MFC (من مايكروسوفت) منهجية التسلسل كجزء من بنية Document-View الخاصة به.
مع إدخال البرمجة الانعكاسية إلى لغة C++26 ، تم تبسيط عملية التسلسل بشكل كبير. تسمح البرمجة الانعكاسية بتسلسل البيانات في وقت الترجمة، على سبيل المثال، JSON إلى structبنية بيانات مطابقة. [ 10 ]
CFML
تتيح لغة CFML إمكانية تحويل هياكل البيانات إلى WDDX باستخدام <cfwddx>الوسم وإلى JSON باستخدام وظيفة SerializeJSON() .
دلفي
توفر دلفي آلية مدمجة لتسلسل المكونات (وتسمى أيضًا الكائنات الدائمة)، وهي متكاملة تمامًا مع بيئة التطوير المتكاملة الخاصة بها . يتم حفظ محتويات المكون في ملف DFM وإعادة تحميلها أثناء التشغيل.
يذهب
تدعم لغة Go بشكل أصلي فكّ/تحويل بيانات JSON و XML . [ 11 ] كما توجد وحدات خارجية تدعم YAML [ 12 ] و Protocol Buffers . [ 13 ] وتدعم Go أيضًا Gobs . [ 14 ]
هاسكل
في لغة هاسكل، يُدعم التسلسل للأنواع المنتمية إلى فئتي النوع Read و Show . يُعرّف كل نوع منتمٍ إلى Readفئة النوع دالةً تستخرج البيانات من التمثيل النصي للبيانات المُخرَجة. Showبدورها، تحتوي فئة النوع على showالدالة التي يُمكن من خلالها توليد تمثيل نصي للكائن. لا يحتاج المبرمج إلى تعريف الدوال صراحةً، فمجرد تعريف نوع ما على أنه مشتق من Read أو Show، أو كليهما، يُمكن أن يجعل المُصرّف يُولّد الدوال المناسبة في كثير من الحالات (ولكن ليس جميعها: فأنواع الدوال، على سبيل المثال، لا يُمكنها أن تشتق Show أو Read تلقائيًا). يُنتج المُستَخرَج تلقائيًا من Show أيضًا شفرة مصدرية صالحة، لذا يُمكن توليد نفس قيمة هاسكل بتشغيل الشفرة التي يُنتجها show، على سبيل المثال، في مُفسّر هاسكل. [ 15 ] وللحصول على تسلسل أكثر كفاءة، توجد مكتبات هاسكل تُتيح التسلسل عالي السرعة بتنسيق ثنائي، مثل binary .
جافا
توفر لغة جافا خاصية التسلسل التلقائي، والتي تتطلب تحديد الكائن من خلال تطبيق java.io.Serializableواجهة معينة . يُحدد تطبيق هذه الواجهة أن الكائن "جاهز للتسلسل"، ثم تتولى جافا عملية التسلسل داخليًا. لا توجد طرق تسلسل مُعرّفة على هذه Serializableالواجهة، ولكن يمكن للكائن القابل للتسلسل تعريف طرق اختيارية بأسماء وتوقيعات خاصة، والتي تُستدعى، في حال تعريفها، كجزء من عملية التسلسل/فك التسلسل. كما تسمح اللغة للمطور بتجاوز عملية التسلسل بشكل أكثر دقة من خلال تطبيق واجهة أخرى، Externalizableوهي واجهة أخرى تتضمن طريقتين خاصتين تُستخدمان لحفظ واستعادة حالة الكائن. هناك ثلاثة أسباب رئيسية لعدم إمكانية تسلسل الكائنات افتراضيًا، وضرورة تطبيقها لهذه Serializableالواجهة للوصول إلى آلية التسلسل في جافا. أولًا، لا تحتفظ جميع الكائنات بدلالات مفيدة في حالتها المُسلسلة. على سبيل المثال، Threadيرتبط الكائن بحالة آلة جافا الافتراضية الحالية . لا يوجد سياق Threadيحتفظ فيه الكائن بعد فك تسلسله بدلالات مفيدة. ثانيًا، تُشكل الحالة المُسلسلة للكائن جزءًا من عقد توافق فئته. يتطلب الحفاظ على التوافق بين إصدارات الفئات القابلة للتسلسل جهدًا إضافيًا ودراسة متأنية. لذا، يجب أن يكون جعل فئة ما قابلة للتسلسل قرارًا تصميميًا مدروسًا، وليس شرطًا افتراضيًا. أخيرًا، يتيح التسلسل الوصول إلى الأعضاء الخاصة غير العابرة في الفئة، والتي لا يمكن الوصول إليها بطرق أخرى. يجب ألا تكون الفئات التي تحتوي على معلومات حساسة (مثل كلمة المرور) قابلة للتسلسل أو قابلة للتصدير. [ 16 ] : 339-345 . تستخدم طريقة التشفير القياسية ترجمةً متكررةً قائمةً على الرسم البياني لوصف فئة الكائن والحقول القابلة للتسلسل إلى دفق بايت. يتم تشفير العناصر الأولية ، بالإضافة إلى الكائنات المرجعية غير العابرة وغير الثابتة، في الدفق. يجب أيضًا تسلسل كل كائن يُشار إليه بواسطة الكائن المُسلسل عبر حقل غير مُعلَّم transient؛ وإذا كان أي كائن في الرسم البياني الكامل لمراجع الكائنات غير العابرة غير قابل للتسلسل، فسيفشل التسلسل. يستطيع المطور التأثير على هذا السلوك بتحديد الكائنات على أنها عابرة، أو بإعادة تعريف عملية التسلسل لكائن ما بحيث يتم اقتطاع جزء من الرسم البياني المرجعي وعدم تسلسله. لا تستخدم لغة جافا المُنشئ لتسلسل الكائنات. من الممكن تسلسل كائنات جافا عبر JDBC وتخزينها في قاعدة بيانات. [ 17 ] بينما في Swingعلى الرغم من أن المكونات تُطبّق واجهة Serializable، إلا أنه لا يُضمن نقلها بين إصدارات مختلفة من آلة جافا الافتراضية. ولذلك، قد يتم تحويل مكون Swing، أو أي مكون يرثها، إلى سلسلة بايتات، ولكن لا يُضمن إمكانية إعادة إنشائها على جهاز آخر.
جافا سكريبت
منذ إصدار ECMAScript 5.1، [ 18 ] أصبحت لغة JavaScript تتضمن الكائن المدمج JSONوطرقه . على الرغم من أن JSON مبنيٌّ في الأصل على مجموعة فرعية من JavaScript، [ 19 ]JSON.parse() إلا أن هناك حالات استثنائية لا يُعتبر فيها JSON لغة JavaScript صالحة. تحديدًا، يسمح JSON بظهور مُنهيات الأسطر Unicode U+2028 (فاصل الأسطر) و U+2029 (فاصل الفقرات) دون تهريب في السلاسل النصية المُقتبسة، بينما لا يسمح بذلك ECMAScript 2018 والإصدارات الأقدم. [ 20 ] [ 21 ] انظر المقالة الرئيسية حول JSON .JSON.stringify()
جوليا
تُنفّذ لغة جوليا عملية التسلسل عبر وحدات serialize()/ deserialize()، [ 22 ] المصممة للعمل ضمن نفس إصدار جوليا، و/أو نسخة من نفس صورة النظام. [ 23 ] توفر الحزمة HDF5.jlبديلاً أكثر استقرارًا، باستخدام تنسيق موثق ومكتبة مشتركة مع أغلفة للغات مختلفة، [ 24 ] بينما يُعتقد أن تنسيق التسلسل الافتراضي قد صُمم مع مراعاة الأداء الأمثل للاتصالات الشبكية. [ 25 ]
التلعثم
بشكل عام، يمكن تسلسل بنية بيانات Lisp باستخدام الدالتين " read" و " print". على سبيل المثال، يمكن طباعة متغير foo يحتوي على قائمة من المصفوفات باستخدام الدالة " " (print foo). وبالمثل، يمكن قراءة كائن من دفق بيانات يُسمى s باستخدام الدالة " " (read s). يُطلق على هذين الجزأين من تطبيق Lisp اسم الطابعة والقارئ. printيكون ناتج الدالة " " قابلاً للقراءة البشرية؛ حيث يستخدم قوائم مفصولة بأقواس، على سبيل المثال: . في العديد من أنواع Lisp، بما في ذلك Common Lisp ، لا تستطيع الطابعة تمثيل جميع أنواع البيانات لعدم وضوح كيفية القيام بذلك. في Common Lisp على سبيل المثال، لا تستطيع الطابعة طباعة كائنات CLOS. بدلاً من ذلك، قد يكتب المبرمج دالة على الدالة العامة ، وسيتم استدعاء هذه الدالة عند طباعة الكائن. يشبه هذا إلى حد ما الدالة المستخدمة في Ruby. يُكتب كود Lisp نفسه بصيغة القارئ، والتي تُسمى صيغة القراءة. تستخدم معظم اللغات محللات منفصلة ومختلفة للتعامل مع الكود والبيانات، بينما تستخدم Lisp محللاً واحداً فقط. يمكن قراءة ملف يحتوي على كود لغة ليسب في الذاكرة كبنية بيانات، ثم تحويله بواسطة برنامج آخر، وبعد ذلك يمكن تنفيذه أو كتابته، كما هو الحال في حلقة القراءة والتقييم والطباعة . لا تدعم جميع برامج القراءة/الكتابة البنى الدورية أو المتكررة أو المشتركة.(42.9"x"y)print-object
.شبكة
يحتوي .NET على العديد من أدوات التسلسل المصممة من قِبل مايكروسوفت . كما توجد العديد من أدوات التسلسل من جهات خارجية. تمت مناقشة واختبار أكثر من اثنتي عشرة أداة تسلسل هنا ( مؤرشف بتاريخ 8 مايو 2015 في Wayback Machine) [ 26 ] وهنا [ 27 ] .
أوكاميل
توفر مكتبة OCaml القياسية إمكانية تحويل البيانات إلى تنسيقات من خلال الوحدةMarshal النمطية [ 3 ] ووظائف Pervasives output_value. input_valueعلى الرغم من أن برمجة OCaml تخضع لفحص ثابت للأنواع، إلا أن استخدام الوحدة Marshalالنمطية قد يُخلّ بضمانات الأنواع، إذ لا توجد طريقة للتحقق مما إذا كان التدفق غير المُحوّل يُمثل كائنات من النوع المتوقع. في OCaml، يصعب تحويل دالة أو بنية بيانات تحتوي على دالة (مثل كائن يحتوي على دالة)، لأن التعليمات البرمجية القابلة للتنفيذ في الدوال لا يمكن نقلها بين برامج مختلفة. (يوجد خيار لتحويل موضع التعليمات البرمجية للدالة، ولكن لا يمكن فك تحويلها إلا في نفس البرنامج). تستطيع دوال التحويل القياسية الحفاظ على المشاركة ومعالجة البيانات الدورية، والتي يمكن ضبطها باستخدام خيار.
بيرل
توفر العديد من وحدات Perl المتاحة على CPAN آليات تسلسل البيانات، بما في ذلك Storable` storable` JSON::XSو` FreezeThawstorable.org`. تتضمن `storable` دوالًا لتسلسل وفك تسلسل هياكل بيانات Perl من وإلى الملفات أو متغيرات Perl العددية. بالإضافة إلى التسلسل المباشر إلى الملفات، Storableتتضمن ` freezestorable` دالة لإرجاع نسخة مُسلسلة من البيانات المُعبأة في متغير عددي، ودالة thawلفك تسلسل هذا المتغير. يُعد هذا مفيدًا لإرسال بنية بيانات معقدة عبر مقبس الشبكة أو تخزينها في قاعدة بيانات. عند تسلسل الهياكل باستخدام `storable` Storable، توجد دوال آمنة للشبكة تُخزن بياناتها دائمًا بتنسيق قابل للقراءة على أي جهاز كمبيوتر مع تأثير طفيف على السرعة. تُسمى هذه الدوال `storable` و` nstorestorable.org` nfreezeوما إلى ذلك. لا توجد دوال "n" لفك تسلسل هذه الهياكل - يتم تسلسل الهياكل العادية thawوهياكل retrieveفك التسلسل باستخدام nدوال "` وما يُعادلها من دوال خاصة بكل جهاز.
PHP
كانت لغة PHP تُنفّذ التسلسل في الأصل من خلال الدوال المدمجة `sequence` serialize()و` unserialize()return`. [ 28 ] تستطيع PHP تسلسل أي نوع من أنواع البيانات باستثناء الموارد (مؤشرات الملفات، والمآخذ، وما إلى ذلك). unserialize()غالبًا ما تكون الدالة المدمجة خطيرة عند استخدامها مع بيانات غير موثوقة تمامًا. [ 29 ] بالنسبة للكائنات، توجد طريقتان سحريتان يمكن تنفيذهما داخل فئة - ` sequence` __sleep()و` __wakeup() return` - يتم استدعاؤهما من داخل `sequence` serialize()و`return` unserialize()على التوالي، ويمكنهما تنظيف الكائن واستعادته. على سبيل المثال، قد يكون من المرغوب فيه إغلاق اتصال قاعدة البيانات عند التسلسل واستعادة الاتصال عند إلغاء التسلسل؛ تتم معالجة هذه الوظيفة في هاتين الطريقتين السحريتين. كما تسمحان للكائن باختيار الخصائص التي يتم تسلسلها. منذ PHP 5.1، توجد آلية تسلسل كائنية التوجه للكائنات، وهي Serializableالواجهة `sequence`. [ 30 ]
مقدمة
يمكن تسلسل بنية المصطلحات في لغة برولوج ، وهي بنية البيانات الوحيدة في اللغة، باستخدام الدالة المضمنة `predicate` write_term/3، وإدخالها باستخدام الدالتين المضمنتين `predicate` read/1و` predicate` read_term/2. ويكون الناتج نصًا غير مضغوط (بترميز محدد بناءً على إعدادات دفق البيانات المستهدف)، مع تمثيل أي متغيرات حرة في المصطلح بأسماء متغيرات بديلة. write_term/3تم توحيد الدالة `predicate` في مواصفات ISO للغة برولوج (ISO/IEC 13211-1) في الصفحات 59 وما بعدها ("كتابة مصطلح، § 7.10.5"). لذا، من المتوقع أن تتمكن تطبيقات أخرى من إدخال المصطلحات التي تم تسلسلها بواسطة تطبيق معين دون أي لبس أو مفاجآت. عمليًا، قد تستخدم امتدادات خاصة بالتطبيقات (مثل قواميس SWI-Prolog) بنى مصطلحات غير قياسية، مما قد يؤدي إلى خلل في التوافق في بعض الحالات. للاطلاع على أمثلة، راجع صفحات الدليل الخاصة بـ SWI-Prolog، [ 31 ] وSICStus Prolog، [ 32 ] وGNU Prolog. [ 33 ] يُترك للمُنفِّذ تحديد ما إذا كانت المصطلحات المُسلسلة المُستلمة عبر الشبكة تُفحص وفقًا للمواصفات (بعد فك تسلسلها من دفق الأحرف) وكيفية ذلك. ويمكن تطبيق قواعد الجملة المحددة المُدمجة في Prolog في هذه المرحلة.
بايثون
pickleتُعدّ وحدة المكتبة القياسية الآلية الأساسية العامة للتسلسل ، وهي مستوحاة من مصطلح "التخليل" (pickling ) المستخدم في أنظمة قواعد البيانات [ 34 ] [ 35 ] [ 36 ] لوصف تسلسل البيانات ( فك التخليل لفك التسلسل ). يستخدم Pickle آلة افتراضية بسيطة قائمة على المكدس لتسجيل التعليمات المستخدمة لإعادة بناء الكائن. وهو تنسيق تسلسل قابل للتخصيص عبر الإصدارات ، ولكنه غير آمن (غير محمي ضد البيانات الخاطئة أو الخبيثة). قد تتسبب البيانات المشوهة أو المُنشأة بشكل خبيث في قيام وحدة فك التسلسل باستيراد وحدات نمطية عشوائية وإنشاء أي كائن. [ 37 ] [ 38 ] تتضمن المكتبة القياسية أيضًا وحدات نمطية للتسلسل إلى تنسيقات بيانات قياسية: (مع دعم مدمج لأنواع البيانات العددية والمجموعات الأساسية، وقادرة على دعم أنواع عشوائية عبر خطافات التشفير وفك التشفير ). (مع دعم لكل من تنسيقات قوائم الخصائص الثنائية وXML ). (مع دعم لمعيار تمثيل البيانات الخارجية (XDR) كما هو موضح في RFC 1014). أخيرًا، يُوصى بأن يكون الكائن قابلاً للتقييم في البيئة المناسبة، مما يجعله متوافقًا تقريبًا مع لغة Common Lisp . لا يمكن تخزين جميع أنواع الكائنات تلقائيًا، خاصةً تلك التي تحتوي على موارد نظام التشغيل مثل مؤشرات الملفات ، ولكن يمكن للمستخدمين تسجيل دوال "اختزال" و"إنشاء" مخصصة لدعم تخزين وفك تخزين أنواع البيانات المختلفة. تم تنفيذ Pickle في الأصل كوحدة بايثون خالصة ، ولكن في إصدارات بايثون السابقة للإصدار 3.0، توفر الوحدة (المدمجة أيضًا) أداءً محسّنًا (أسرع بما يصل إلى 1000 مرة [ 37 ] ). تم اقتباس هذه الوحدة من مشروع Unladen Swallow . في بايثون 3، يجب على المستخدمين دائمًا استيراد الإصدار القياسي، الذي يحاول استيراد الإصدار المُسرّع ثم يعود إلى إصدار بايثون الخالص. [ 39 ]jsonplistlibxdrlib__repr__print-objectpicklecPicklecPickle
R
تحتوي لغة R على دالة dputلكتابة تمثيل نصي ASCII لكائن R في ملف أو اتصال. يمكن قراءة التمثيل من ملف باستخدام هذه الدالة dget. [ 40 ] وبشكل أكثر تحديدًا، تقوم هذه الدالة serializeبتحويل كائن R إلى اتصال، ويكون الناتج عبارة عن متجه خام مُشفّر بصيغة سداسية عشرية. unserializeتسمح هذه الدالة بقراءة كائن من اتصال أو من متجه خام. [ 41 ]
ثورة
ستقوم لغة REBOL بتحويل البيانات إلى ملف ( save/all) أو إلى string!( mold/all). يمكن فك تشفير السلاسل النصية والملفات باستخدام الدالة متعددة الأشكالload . RProtoBufتوفر هذه الدالة إمكانية تحويل البيانات عبر اللغات في لغة R، باستخدام بروتوكول Buffers . [ 42 ]
روبي
تتضمن لغة روبي وحدة نمطية قياسية Marshalتحتوي على طريقتين، وهما `is` dumpو`is` load، على غرار أدوات يونكس القياسية `is` dumpو`is` restore. تُحوّل هاتان الطريقتان البيانات إلى الفئة القياسية String`is`، أي أنها تُصبح فعليًا سلسلة من البايتات. لا يمكن تحويل بعض الكائنات إلى بيانات (لأن ذلك سيؤدي إلى ظهور TypeErrorاستثناء): مثل الروابط، وكائنات الإجراءات، ومثيلات الفئة `IO`، والكائنات الفردية، والواجهات. إذا كانت فئة ما تتطلب تحويلًا مخصصًا للبيانات (على سبيل المثال، تتطلب إجراءات تنظيف معينة عند التفريغ/الاستعادة)، فيمكن القيام بذلك من خلال تنفيذ الطريقتين `is` _dumpو`is` _load. يجب أن تُعيد طريقة `is` كائنًا يحتوي على جميع المعلومات اللازمة لإعادة تكوين كائنات هذه الفئة وجميع الكائنات المُشار إليها حتى عمق أقصى مُحدد كمعامل عدد صحيح (القيمة -1 تعني تعطيل فحص العمق). يجب أن تأخذ طريقة `is` كائنًا من الفئة `is` وتُعيد كائنًا من هذه الفئة._dumpString_loadString
الصدأ

Pointيُطبّق نموذجنا الهيكلي السمات SerializeوالخصائصDeserializeSerdeتُعد المكتبة الأكثر استخدامًا، أو الحزمة، للتسلسل في لغة Rust والتي توفر السمات Serializeوالخصائص Deserialize.
أحاديث قصيرة
بشكل عام، يمكن تخزين واسترجاع الكائنات غير المتكررة وغير المشتركة بصيغة قابلة للقراءة البشرية باستخدام بروتوكول storeOn:/ readFrom:. storeOn:تُنشئ هذه الطريقة نص تعبير Smalltalk الذي - عند تقييمه باستخدام readFrom:- يُعيد إنشاء الكائن الأصلي. يتميز هذا المخطط باستخدامه وصفًا إجرائيًا للكائن، وليس البيانات نفسها. ولذلك، فهو مرن للغاية، مما يسمح للفئات بتعريف تمثيلات أكثر إيجازًا. مع ذلك، في شكله الأصلي، لا يتعامل مع هياكل البيانات الدورية ولا يحافظ على هوية المراجع المشتركة (أي، سيتم استعادة مرجعين لكائن واحد كمرجعين لنسختين متساويتين، ولكنهما ليستا متطابقتين). لهذا الغرض، توجد بدائل محمولة وغير محمولة متنوعة. بعضها خاص بتنفيذ Smalltalk معين أو مكتبة فئات. توجد عدة طرق في Squeak Smalltalk لتسلسل الكائنات وتخزينها. أسهلها وأكثرها استخدامًا هي storeOn:/readFrom:تنسيقات التخزين الثنائية القائمة على SmartRefStreamالمُسلسلات. بالإضافة إلى ذلك، يمكن تخزين الكائنات المجمعة واسترجاعها باستخدام ImageSegments. يوفر كلا النظامين ما يُسمى "إطار تخزين الكائنات الثنائية"، والذي يدعم تحويل البيانات إلى صيغة ثنائية مضغوطة واسترجاعها منها. ويتعامل كلاهما مع البنى الدورية والتكرارية والمشتركة، وتخزين/استرجاع معلومات الفئات والفئات الوصفية ، ويتضمن آليات لترحيل الكائنات "أثناء التشغيل" (أي لتحويل النسخ التي كُتبت بواسطة إصدار أقدم من فئة ذات تخطيط كائن مختلف). تتشابه واجهات برمجة التطبيقات (storeBinary/readBinary)، لكن تفاصيل التشفير مختلفة، مما يجعل هذين التنسيقين غير متوافقين. ومع ذلك، فإن كود Smalltalk/X مفتوح المصدر ومجاني، ويمكن تحميله في أنظمة Smalltalk أخرى للسماح بتبادل الكائنات بين اللهجات المختلفة. لا يُعد تحويل الكائنات جزءًا من مواصفات ANSI Smalltalk. ونتيجة لذلك، يختلف كود تحويل الكائن باختلاف تطبيق Smalltalk. كما تختلف البيانات الثنائية الناتجة أيضًا. على سبيل المثال، لا يمكن استعادة كائن مُحوّل تم إنشاؤه في Squeak Smalltalk في Ambrai Smalltalk . نتيجةً لذلك، لا تستطيع العديد من التطبيقات التي تعمل على إصدارات متعددة من لغة Smalltalk وتعتمد على تسلسل الكائنات، مشاركة البيانات بين هذه الإصدارات المختلفة. تشمل هذه التطبيقات قاعدة بيانات الكائنات MinneStore [ 43 ] وبعض حزم RPC . يُعد SIXX [ 44 ] حلاً لهذه المشكلة، وهو حزمة تدعم إصدارات متعددة من Smalltalk وتستخدم تنسيق XML للتسلسل.
سويفت
توفر مكتبة Swift القياسية بروتوكولين، Encodableوهما Decodable(يُدمجان معًا كـ Codable)، يسمحان بتحويل أو فك تحويل مثيلات الأنواع المتوافقة إلى JSON أو قوائم الخصائص أو تنسيقات أخرى. [ 45 ] يمكن للمترجم إنشاء تطبيقات افتراضية لهذين البروتوكولين للأنواع التي تكون خصائصها المخزنة أيضًا من النوع Decodableأو Encodable.
باور شيل
تُنفّذ PowerShell عملية التسلسل من خلال الأمر cmdlet المدمجExport-CliXML . Export-CliXMLيقوم هذا الأمر بتسلسل كائنات .NET وتخزين ملف XML الناتج في ملف. لإعادة تكوين الكائنات، استخدم الأمر Import-CliXMLcmdlet الذي يُنشئ كائنًا مُفكّكًا من ملف XML المُصدّر. الكائنات المُفكّكة، والمعروفة غالبًا باسم "حقائب الخصائص"، ليست كائنات حية؛ بل هي لقطات تحتوي على خصائص، ولكن بدون دوال. يمكن أيضًا تسلسل (أو فك تسلسل) هياكل البيانات ثنائية الأبعاد بتنسيق CSVImport-CSV باستخدام أوامر cmdlets المدمجة Export-CSV.
انظر أيضاً
مراجع
- ↑ كلاين، مارشال. "أسئلة وأجوبة حول لغة C++: "ما هو موضوع "التسلسل" هذا؟"مؤرشف من الأصل بتاريخ 2015-04-05. يتيح لك هذا البرنامج أخذ كائن أو مجموعة كائنات، ووضعها على قرص أو إرسالها عبر آلية نقل سلكية أو لاسلكية، ثم لاحقًا، ربما على جهاز كمبيوتر آخر، عكس العملية، واستعادة الكائن ( الكائنات
) الأصلي. وتتمثل الآليات الأساسية في تحويل الكائن (الكائنات) إلى سلسلة أحادية البعد من البتات، ثم تحويل سلسلة البتات هذه مرة أخرى إلى الكائن (الكائنات) الأصلي.
- ↑ "الوحدة: مارشال (روبي 3.0.2)" . ruby-doc.org . تم الاطلاع عليه بتاريخ 25 يوليو 2021 .
- 1 2 "مارشال" . OCaml . تم الاسترجاع في 25 يوليو 2021 .
- ↑ "توثيق بايثون 3.9.6 - تسلسل كائنات بايثون —pickle" . التوثيق - مكتبة بايثون القياسية .
- ↑ إس. ميلر، مارك. "التسلسل الآمن في ظل الشك المتبادل" . ERights.org .
التسلسل، الموضح أدناه، هو مثال على أداة تستخدمها الكائنات داخل نظام كائنات للعمل على الرسم البياني الذي تُضمّن فيه. يبدو أن هذا يتطلب انتهاك التغليف الذي يوفره نموذج الكائن النقي.
- ↑ صن مايكروسيستمز (1987). "XDR: معيار تمثيل البيانات الخارجية" . RFC 1014. مجموعة عمل الشبكة . تم الاطلاع عليه في 11 يوليو 2011 .
- ↑ "التسلسل" . www.boost.org .
- ↑ بيال، ستيفان. "s11n.net: تسلسل/استمرارية الكائنات في لغة C++" . s11n.net .
- ↑ "وثائق الحبوب - الرئيسية" . uscilab.github.io .
- ^ بيتر ديموف، دان كاتز، بري ريزفين، ديفيد فانديفورد (19 يونيو 2025). "ربط كائن فرعي من الفئة الأساسية" . isocpp.org . مجموعة العمل 21.
{{cite web}}: صيانة CS1: أسماء متعددة: قائمة المؤلفين ( رابط ) - ↑ "ترميز الحزمة" . pkg.go.dev . 12 يوليو 2021.
- ↑ "GitHub - دعم YAML للغة Go" . GitHub . تم الاطلاع عليه بتاريخ 25 يوليو 2021 .
- ↑ "proto · pkg.go.dev" . pkg.go.dev . تم الاسترجاع بتاريخ 22-06-2021 .
- ↑ "حزمة gob - ترميز/gob - pkg.go.dev" . pkg.go.dev . تم الاسترجاع في 2022-03-04 .
- ↑ "وثائق Text.Show" . تم الاطلاع عليها بتاريخ 15 يناير 2014 .
- ↑ بلوخ، جوشوا (2018). "جافا الفعّالة: دليل لغة البرمجة" ( الطبعة الثالثة). أديسون-ويسلي. ISBN 978-0134685991.
- ↑ "اسأل توم "تحويل كائنات جافا إلى قاعدة البيانات (و...)"" . asktom.oracle.com .
- ↑ "JSON" . وثائق MDN على الويب . تم الاطلاع عليه بتاريخ 22 مارس 2018 .
- ↑ "JSON" . www.json.org . تم الاطلاع عليه بتاريخ 22 مارس 2018 .
- ↑ هولم، ماغنوس (15 مايو 2011). "JSON: مجموعة فرعية من جافا سكريبت ليست كذلك" . المستودع الخالد. مؤرشف من الأصل في 13 مايو 2012. تم الاسترجاع في 23 سبتمبر 2016 .
- ↑ "اقتراح اللجنة الفنية 39: دمج JSON" . لجنة ECMA TC39. 22 مايو 2018.
- ↑ "التسلسل" . لغة جوليا . تم الاطلاع عليه بتاريخ 25 يوليو 2021 .
- ↑ "تسلسل أسرع وأكثر إحكامًا للرموز والسلاسل النصية · JuliaLang/julia@bb67ff2" . GitHub .
- ↑ "HDF5.jl: حفظ وتحميل البيانات بتنسيق ملف HDF5" . 20 أغسطس 2017 – عبر GitHub.
- ↑ "جوليا: ما مدى استقرار serialize() / deserialize()؟" . stackoverflow.com . 2014.
- ↑ "مُسلسلات .NET" . مؤرشف من الأصل بتاريخ 8 مايو 2015. تم الاطلاع عليه بتاريخ 21 مايو 2015.
توجد أنواع عديدة من المُسلسلات؛ فهي تُنتج بيانات مضغوطة للغاية وبسرعة فائقة. هناك مُسلسلات للمراسلة، وأخرى لمخازن البيانات، وثالثة لترتيب الكائنات. ما هو أفضل مُسلسل في .NET؟
- ↑ "SERBENCH by aumcode" . aumcode.github.io .
- ↑ "PHP: تسلسل الكائنات - دليل" . ca.php.net .
- ↑ إيسر، ستيفن (28-11-2009). "أخبار صادمة في استغلال PHP" . Suspekt.. . مؤرشف من الأصل في 6-1-2012.
- ↑ "PHP: Serializable - Manual" . www.php.net .
- ↑ ""القراءة والكتابة خلال الفصل الدراسي"" . www.swi-prolog.org .
- ↑ ""write_term/ [ 2,3 ] "" . sicstus.sics.se .
- ↑ ""مصطلح الإدخال/الإخراج"" . gprolog.org .
- ↑ هيرليهي، موريس ؛ ليسكوف، باربرا (أكتوبر 1982). "طريقة لنقل القيم لأنواع البيانات المجردة" (ملف PDF) . معاملات ACM في لغات البرمجة والأنظمة . 4 (4): 527-551 . CiteSeerX 10.1.1.87.5301 . doi : 10.1145/69622.357182 . ISSN 0164-0925 . OCLC 67989840. S2CID 8126961 .
- ↑ بيريل، أندرو؛ جونز، مايك؛ ووبر، تيد (نوفمبر 1987). "تنفيذ بسيط وفعال لقاعدة بيانات صغيرة". وقائع ندوة ACM الحادية عشرة حول مبادئ أنظمة التشغيل - SOSP '87 . المجلد 11. الصفحات 149-154 . CiteSeerX 10.1.1.100.1457 . doi : 10.1145/41457.37517 . ISBN 089791242XISSN 0163-5980 . OCLC 476062921. S2CID 12908261. يستخدم تطبيقنا آلية تُسمى " pickles"، والتي تُحوّل بين أي بنية بيانات ذات نوع مُحدد بدقة وتمثيل لتلك البنية مناسب للتخزين في ملفات القرص الدائمة. تأخذ عملية Pickle.Write مؤشرًا إلى بنية بيانات ذات نوع مُحدد بدقة وتُرسل مخازن مؤقتة
من البتات للكتابة إلى القرص. في المقابل، تقرأ عملية Pickle.Read مخازن مؤقتة من البتات من القرص وتُرسل نسخة من بنية البيانات الأصلية. (*) يتضمن هذا التحويل تحديد مواضع العناوين في البنية، والتأكد من استبدال العناوين بعناوين صالحة في بيئة التنفيذ الحالية عند قراءة البنية من القرص. آلية pickle آلية تلقائية بالكامل: فهي مدفوعة بهياكل تحديد الأنواع في وقت التشغيل الموجودة لآلية جمع البيانات المهملة لدينا. ... (*) يُشبه Pickling إلى حد كبير مفهوم التنسيق في استدعاءات الإجراءات عن بُعد. لكن في الواقع، يعتمد تطبيقنا للتخزين المؤقت على تفسير بنية القيم
ذات الأنواع الديناميكية
أثناء التشغيل
، بينما يعتمد تطبيقنا لبروتوكول استدعاء الإجراءات عن بُعد على توليد شيفرة لترتيب القيم ذات الأنواع الثابتة. سيستفيد كل تطبيق من إضافة آليات التطبيق الآخر، لكن ذلك لم يتم بعد.
- ↑ فان روسوم، غيدو (1 ديسمبر 1994). "تسطيح كائنات بايثون" . لغة برمجة بايثون - موقع الويب القديم . ديلاوير ، الولايات المتحدة: مؤسسة برمجيات بايثون . تم الاسترجاع في 6 أبريل 2017.
أصل تسمية "التسطيح": نظرًا لأنني أرغب في ترك وحدة "marshal" الأصلية كما هي، ولأن جيم اشتكى من أن "التسلسل" يعني أيضًا شيئًا مختلفًا تمامًا ولكنه ذو صلة في سياق الوصول
المتزامن
إلى الكائنات الدائمة، فسأستخدم مصطلح "التسطيح" من الآن فصاعدًا. ... (يستخدم نظام Modula-3 مصطلح البيانات "المُخَلَّلة" لهذا المفهوم. ربما يكونون قد حلوا جميع المشاكل بالفعل، وبطريقة آمنة من حيث النوع
:-)
- 1 2 "11.1. pickle — تسلسل كائنات بايثون — وثائق بايثون 2.7.14rc1" . docs.python.org .
- ↑ "pickle — تسلسل كائنات بايثون — وثائق بايثون الإصدار 3.0.1" . docs.python.org .
- ↑ "ما الجديد في بايثون 3.0 — وثائق بايثون الإصدار 3.1.5" . docs.python.org .
- ↑ [دليل R http://stat.ethz.ch/R-manual/R-patched/library/base/html/dput.html ]
- ↑ [دليل R http://stat.ethz.ch/R-manual/R-patched/library/base/html/serialize.html ]
- ↑ إيدلبوتيل، ديرك؛ ستوكلي، موراي؛ أومز، جيرون (2014). "RProtoBuf: تسلسل البيانات الفعال عبر اللغات في R" . مجلة البرمجيات الإحصائية . 71 (2). arXiv : 1401.7372 . doi : 10.18637/jss.v071.i02 . S2CID 36239952 .
- ↑ "MinneStore الإصدار 2" . SourceForge . مؤرشف من الأصل في 11 مايو 2008.
- ↑ "ما الجديد" . SIXX - Smalltalk Instance eXchange in XML . 23 يناير 2010. تم الاطلاع عليه في 25 يوليو 2021 .
- ↑ "Swift Archival & Serialization" . www.github.com . 2018-12-02.
روابط خارجية
- أساسيات التسلسل
- وثائق تسلسل كائنات جافا
- وثائق تسلسل الكائنات في جافا 1.4 .
- جافا المتينة: التسلسل ( مؤرشف بتاريخ 25 نوفمبر 2005 في أرشيف الإنترنت)
- موارد ربط بيانات XML
- لوحة البيانات - التسلسل الثنائي مع الوصول الجزئي والعشوائي، ونظام الأنواع، وRPC، وتكييف الأنواع، وتنسيق النص
- تنسيقات تسلسل البيانات
- المثابرة
