التسلسل
قد لا يتوافق استخدام هذه المقالة للروابط الخارجية مع سياسات ويكيبيديا أو إرشاداتها . ( أغسطس 2024 ) |

في الحوسبة، التسلسل (أو التسلسل ) هو عملية ترجمة بنية بيانات أو حالة كائن إلى تنسيق يمكن تخزينه (على سبيل المثال الملفات في أجهزة التخزين الثانوية ، أو مخازن البيانات في أجهزة التخزين الأولية) أو نقله (على سبيل المثال تدفقات البيانات عبر شبكات الكمبيوتر ) وإعادة بنائه لاحقًا (ربما في بيئة كمبيوتر مختلفة). [1] عندما تتم إعادة قراءة سلسلة البتات الناتجة وفقًا لتنسيق التسلسل، يمكن استخدامها لإنشاء نسخة طبق الأصل متطابقة دلاليًا للكائن الأصلي. بالنسبة للعديد من الكائنات المعقدة، مثل تلك التي تستخدم المراجع على نطاق واسع ، فإن هذه العملية ليست مباشرة. لا يتضمن تسلسل الكائنات أيًا من الطرق المرتبطة بها والتي كانت مرتبطة بها سابقًا.
تُسمى عملية تسلسل الكائن أيضًا تجميع الكائن في بعض المواقف. [2] [3] [4] العملية المعاكسة، استخراج بنية بيانات من سلسلة من البايتات، هي إلغاء التسلسل (وتسمى أيضًا إلغاء التسلسل أو إلغاء التجميع ).
في أجهزة معدات الشبكات، الجزء المسؤول عن التسلسل وإلغاء التسلسل يسمى عادةً SerDes .
الاستخدامات
تتضمن استخدامات التسلسل ما يلي:
- تسلسل البيانات لنقلها عبر الأسلاك والشبكات ( المراسلة ).
- تخزين البيانات (في قواعد البيانات ، على محركات الأقراص الصلبة ).
- استدعاءات الإجراءات عن بعد ، على سبيل المثال، كما هو الحال في SOAP .
- توزيع الكائنات، وخاصة في هندسة البرمجيات القائمة على المكونات مثل COM ، وCORBA ، وما إلى ذلك.
- الكشف عن التغييرات في البيانات المتغيرة مع الزمن.
لكي تكون بعض هذه الميزات مفيدة، يجب الحفاظ على استقلالية البنية. على سبيل المثال، لتحقيق أقصى استفادة من التوزيع، يجب أن يكون الكمبيوتر الذي يعمل على بنية أجهزة مختلفة قادرًا على إعادة بناء دفق بيانات متسلسل بشكل موثوق، بغض النظر عن الترتيب النهائي . وهذا يعني أن الإجراء الأبسط والأسرع المتمثل في نسخ تخطيط الذاكرة لبنية البيانات مباشرة لا يمكن أن يعمل بشكل موثوق لجميع البنيات. يعني تسلسل بنية البيانات بتنسيق مستقل عن البنية منع مشاكل ترتيب البايتات أو تخطيط الذاكرة أو ببساطة طرق مختلفة لتمثيل هياكل البيانات في لغات برمجة مختلفة .
إن ما يميز أي مخطط تسلسلي هو أنه نظرًا لأن ترميز البيانات متسلسل بحكم التعريف، فإن استخراج جزء من بنية البيانات التسلسلية يتطلب قراءة الكائن بالكامل من البداية إلى النهاية وإعادة بنائه. وفي العديد من التطبيقات، يعد هذا الخطية ميزة، لأنه يتيح استخدام واجهات إدخال/إخراج بسيطة ومشتركة لحفظ حالة الكائن وتمريرها. وفي التطبيقات حيث يكون الأداء العالي مشكلة، فقد يكون من المنطقي بذل المزيد من الجهد للتعامل مع تنظيم تخزين غير خطي أكثر تعقيدًا.
حتى على جهاز واحد، تكون كائنات المؤشر البدائية هشة للغاية بحيث لا يمكن حفظها لأن الكائنات التي تشير إليها قد يتم إعادة تحميلها إلى موقع مختلف في الذاكرة. للتعامل مع هذا، تتضمن عملية التسلسل خطوة تسمى إلغاء التبديل أو إلغاء تبديل المؤشر ، حيث يتم تحويل مراجع المؤشر المباشرة إلى مراجع بناءً على الاسم أو الموضع. تتضمن عملية إلغاء التسلسل خطوة عكسية تسمى تبديل المؤشر .
نظرًا لأنه يمكن تشغيل كل من التسلسل وإلغاء التسلسل من التعليمات البرمجية المشتركة (على سبيل المثال، وظيفة التسلسل في فئات Microsoft Foundation )، فمن الممكن أن يقوم التعليمات البرمجية المشتركة بكلا الأمرين في نفس الوقت، وبالتالي، 1) اكتشاف الاختلافات بين الكائنات التي يتم تسلسلها ونسخها السابقة، و2) توفير المدخلات للكشف التالي. ليس من الضروري بناء النسخة السابقة فعليًا لأنه يمكن اكتشاف الاختلافات أثناء التنفيذ، وهي تقنية تسمى التنفيذ التفاضلي. وهذا مفيد في برمجة واجهات المستخدم التي يتغير محتواها بمرور الوقت - يمكن إنشاء الكائنات الرسومية أو إزالتها أو تغييرها أو جعلها تتعامل مع أحداث الإدخال دون الحاجة بالضرورة إلى كتابة تعليمات برمجية منفصلة للقيام بهذه الأشياء.
العيوب
يكسر التسلسل غموض نوع البيانات المجرد من خلال الكشف عن تفاصيل التنفيذ الخاصة. قد تنتهك التنفيذات البسيطة التي تقوم بتسلسل جميع عناصر البيانات التغليف . [5]
لتثبيط المنافسين عن صنع منتجات متوافقة، غالبًا ما يحتفظ ناشرو البرامج الاحتكارية بتفاصيل تنسيقات التسلسل لبرامجهم باعتبارها سرًا تجاريًا . يقوم البعض عمدًا بإخفاء أو حتى تشفير البيانات التسلسلية. ومع ذلك، تتطلب قابلية التشغيل البيني أن تكون التطبيقات قادرة على فهم تنسيقات التسلسل الخاصة بكل منها. لذلك، تحدد هياكل استدعاء الطريقة عن بُعد مثل CORBA تنسيقات التسلسل الخاصة بها بالتفصيل.
تحاول العديد من المؤسسات، مثل الأرشيفات والمكتبات، تأمين أرشيفاتها الاحتياطية في المستقبل - وخاصة تفريغات قواعد البيانات - من خلال تخزينها في تنسيق تسلسلي قابل للقراءة من قبل البشر نسبيًا .
تنسيقات التسلسل
أثرت تقنية Xerox Network Systems Courier في أوائل الثمانينيات على أول معيار تم تبنيه على نطاق واسع. نشرت Sun Microsystems التمثيل الخارجي للبيانات (XDR) في عام 1987. [6] XDR هو تنسيق مفتوح وموحد باعتباره STD 67 (RFC 4506).
في أواخر التسعينيات، بدأت حملة لتوفير بديل لبروتوكولات التسلسل القياسية: تم استخدام XML ، وهي مجموعة فرعية من SGML ، لإنتاج ترميز قائم على النص يمكن قراءته من قبل البشر . يمكن أن يكون مثل هذا الترميز مفيدًا للكائنات المستمرة التي يمكن قراءتها وفهمها من قبل البشر، أو توصيلها إلى أنظمة أخرى بغض النظر عن لغة البرمجة. لديه عيب فقدان الترميز الأكثر إحكاما القائم على تيار البايت، ولكن في هذه المرحلة جعلت قدرات التخزين والنقل الأكبر حجم الملف أقل إثارة للقلق مما كان عليه في الأيام الأولى للحوسبة. في العقد الأول من القرن الحادي والعشرين، غالبًا ما تم استخدام XML للنقل غير المتزامن للبيانات المنظمة بين العميل والخادم في تطبيقات الويب Ajax . XML هو تنسيق مفتوح وموحد كتوصية W3C.
JSON هو بديل خفيف الوزن لـ XML، ويُستخدم أيضًا بشكل شائع في الاتصال بين العميل والخادم في تطبيقات الويب. يعتمد JSON على بناء جملة JavaScript ، ولكنه مستقل عن 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++ التسلسل كأي نوع من أنواع البناء عالي المستوى، ولكن كلتا اللغتين تدعمان كتابة أي من أنواع البيانات المضمنة ، بالإضافة إلى هياكل البيانات القديمة البسيطة ، كبيانات ثنائية. على هذا النحو، من السهل عادةً كتابة وظائف التسلسل المخصصة. علاوة على ذلك، فإن الحلول القائمة على المترجم، مثل نظام ODB ORM لـ C++ ومجموعة أدوات gSOAP لـ C وC++، قادرة على إنتاج كود التسلسل تلقائيًا مع القليل من التعديلات أو بدونها على إعلانات الفئة. أطر التسلسل الشائعة الأخرى هي Boost.Serialization [7] من Boost Framework ، وإطار S11n، [8] وCereal. [9] يوفر إطار عمل MFC (Microsoft) أيضًا منهجية التسلسل كجزء من بنية Document-View الخاصة به.
سي اف ام ال
يسمح CFML بتسلسل هياكل البيانات إلى WDDX باستخدام <cfwddx>العلامة وإلى JSON باستخدام وظيفة SerializeJSON().
دلفي
توفر Delphi آلية مدمجة لتسلسل المكونات (وتسمى أيضًا الكائنات الدائمة)، والتي يتم دمجها بالكامل مع IDE الخاص بها . يتم حفظ محتويات المكون في ملف DFM وإعادة تحميلها أثناء التشغيل.
يذهب
يدعم Go بشكل أصلي إلغاء تجميع/تجميع بيانات JSON و XML . [10] هناك أيضًا وحدات تابعة لجهات خارجية تدعم YAML [11] و Protocol Buffers . [12] يدعم Go أيضًا Gobs . [13]
هاسكل
في هاسكل، يتم دعم التسلسل للأنواع التي هي أعضاء في فئتي النوع Read وShow . يحدد كل نوع هو عضو في Readفئة النوع دالة ستستخرج البيانات من التمثيل النصي للبيانات المفرغة. Showتحتوي فئة النوع، بدورها، على showالدالة التي يمكن من خلالها إنشاء تمثيل نصي للكائن. لا يحتاج المبرمج إلى تعريف الوظائف صراحةً - مجرد إعلان نوع ما على أنه مشتق من Read أو مشتق من Show، أو كليهما، يمكن أن يجعل المترجم يولد الوظائف المناسبة للعديد من الحالات (ولكن ليس كلها: لا يمكن لأنواع الوظائف، على سبيل المثال، اشتقاق Show أو Read تلقائيًا). تنتج المثيل المولد تلقائيًا لـ Show أيضًا كود مصدر صالح، لذلك يمكن إنشاء نفس قيمة Haskell عن طريق تشغيل الكود الذي تم إنتاجه بواسطة show، على سبيل المثال، في مفسّر Haskell. [14] لمزيد من التسلسل الفعال، توجد مكتبات Haskell تسمح بالتسلسل عالي السرعة بتنسيق ثنائي، على سبيل المثال ثنائي.
جافا
توفر Java تسلسلًا تلقائيًا يتطلب تمييز الكائن من خلال تنفيذ java.io.Serializable الواجهة . يؤدي تنفيذ الواجهة إلى تمييز الفئة على أنها "مقبولة للتسلسل"، ثم تتولى Java معالجة التسلسل داخليًا. لا توجد طرق تسلسل محددة على الواجهة Serializable، ولكن يمكن للفئة القابلة للتسلسل تحديد طرق اختيارية بأسماء وتوقيعات خاصة معينة، وإذا تم تعريفها، فسيتم استدعاؤها كجزء من عملية التسلسل/إلغاء التسلسل. تسمح اللغة أيضًا للمطور بتجاوز عملية التسلسل بشكل أكثر شمولاً من خلال تنفيذ واجهة أخرى، وهي Externalizableالواجهة، والتي تتضمن طريقتين خاصتين تستخدمان لحفظ حالة الكائن واستعادتها.
هناك ثلاثة أسباب رئيسية لعدم إمكانية تسلسل الكائنات افتراضيًا ويجب تنفيذ الواجهة Serializableللوصول إلى آلية التسلسل في Java.
أولاً، لا تلتقط جميع الكائنات دلالات مفيدة في حالة التسلسل. على سبيل المثال، Threadيرتبط الكائن بحالة JVM الحالية . لا يوجد سياق Threadيحافظ فيه الكائن غير المتسلسل على الدلالات المفيدة.
ثانيًا، تشكل الحالة التسلسلية للكائن جزءًا من عقد توافق فئته. تتطلب المحافظة على التوافق بين إصدارات الفئات القابلة للتسلسل جهدًا إضافيًا واعتبارًا. لذلك، يجب أن يكون جعل الفئة قابلة للتسلسل قرار تصميم متعمد وليس شرطًا افتراضيًا.
أخيرًا، يسمح التسلسل بالوصول إلى الأعضاء الخاصة غير المؤقتة للفئة والتي لا يمكن الوصول إليها بخلاف ذلك. لا ينبغي أن تكون الفئات التي تحتوي على معلومات حساسة (على سبيل المثال، كلمة مرور) قابلة للتسلسل ولا يمكن إخراجها. [15] : 339–345 تستخدم طريقة الترميز القياسية ترجمة متكررة تعتمد على الرسم البياني لوصف فئة الكائن والحقول القابلة للتسلسل في مجرى بايت. يتم ترميز العناصر الأولية وكذلك الكائنات المرجعية غير المؤقتة وغير الثابتة في المجرى. transientيجب أيضًا تسلسل كل كائن تتم الإشارة إليه بواسطة الكائن المتسلسل عبر حقل غير مميز كـ؛ وإذا كان أي كائن في الرسم البياني الكامل لمراجع الكائنات غير المؤقتة غير قابل للتسلسل، فستفشل التسلسل. يمكن للمطور التأثير على هذا السلوك عن طريق وضع علامة على الكائنات على أنها مؤقتة، أو عن طريق إعادة تعريف التسلسل لكائن بحيث يتم اقتطاع جزء من الرسم البياني المرجعي وعدم تسلسله.
لا تستخدم Java منشئًا لتسلسل الكائنات. من الممكن تسلسل كائنات Java من خلال JDBC وتخزينها في قاعدة بيانات. [16] بينما Swingعلى الرغم من أن المكونات تنفذ واجهة Serializable، إلا أنه لا يتم ضمان إمكانية نقلها بين إصدارات مختلفة من Java Virtual Machine. وبالتالي، يمكن تحويل مكون Swing، أو أي مكون يرثه، إلى دفق بايتات، ولكن لا يتم ضمان إمكانية إعادة تكوينه على جهاز آخر.
جافا سكريبت
منذ ECMAScript 5.1، [17] تضمنت JavaScript الكائن المضمّن JSONوطرقه JSON.parse()و JSON.stringify(). على الرغم من أن JSON يعتمد في الأصل على مجموعة فرعية من JavaScript، [18] فهناك حالات حدودية حيث لا يكون JSON JavaScript صالحًا. على وجه التحديد، يسمح JSON لعلامات نهاية سطر Unicode U+2028 LINE SEPARATOR و U+2029 PARAGRAPH SEPARATOR بالظهور بدون أي تهريب في السلاسل المقتبسة، بينما لا يسمح ECMAScript 2018 والإصدارات الأقدم بذلك. [19] [20] راجع المقال الرئيسي حول JSON [ broken anchor ] .
جوليا
تنفذ Julia التسلسل من خلال وحدات serialize()/ [21] المخصصة للعمل ضمن نفس إصدار Julia، و/أو مثيل لنفس صورة النظام. [22] تقدم الحزمة بديلاً أكثر استقرارًا، باستخدام تنسيق موثق ومكتبة مشتركة مع غلافات للغات مختلفة، [23] بينما يُقترح أن تنسيق التسلسل الافتراضي قد تم تصميمه مع وضع الأداء الأقصى لاتصالات الشبكة في الاعتبار. [24]deserialize()HDF5.jl
ليشبس
بشكل عام، يمكن تسلسل بنية بيانات Lisp باستخدام الدالتين " read" و " print". سيتم طباعة متغير foo يحتوي، على سبيل المثال، على قائمة من المصفوفات بواسطة (print foo). وبالمثل، يمكن قراءة كائن من مجرى يسمى s بواسطة (read s). يُطلق على هذين الجزأين من تنفيذ Lisp اسم الطابعة والقارئ. printيكون ناتج " " قابلاً للقراءة من قبل البشر؛ فهو يستخدم قوائم مُميزة بأقواس، على سبيل المثال: . في العديد من أنواع Lisp، بما في ذلك Common Lisp ، لا يمكن للطابعة تمثيل كل نوع من البيانات لأنه ليس من الواضح كيفية القيام بذلك. في Common Lisp على سبيل المثال، لا يمكن للطابعة طباعة كائنات CLOS. بدلاً من ذلك، قد يكتب المبرمج طريقة على الدالة العامة ، سيتم استدعاء هذه الطريقة عند طباعة الكائن. هذا مشابه إلى حد ما للطريقة المستخدمة في Ruby. يتم كتابة كود Lisp نفسه في صيغة القارئ، والتي تسمى صيغة القراءة. تستخدم معظم اللغات محللات منفصلة ومختلفة للتعامل مع الكود والبيانات، تستخدم Lisp واحدة فقط. يمكن قراءة ملف يحتوي على كود lisp في الذاكرة كبنية بيانات، وتحويله بواسطة برنامج آخر، ثم تنفيذه أو كتابته، كما هو الحال في حلقة القراءة والتقييم والطباعة . لا تدعم جميع برامج القراءة/الكتابة الهياكل الدورية أو المتكررة أو المشتركة.
(4 2.9 "x" y)print-object
.شبكة
يحتوي .NET على العديد من المسلسلات المصممة بواسطة Microsoft . وهناك أيضًا العديد من المسلسلات التي صممتها جهات خارجية. تتم مناقشة واختبار أكثر من اثني عشر مسلسلًا هنا. [25] وهنا [26]
أوكامل
توفر مكتبة OCamlMarshal القياسية التجميع من خلال الوحدة [3] ووظائف Pervasives output_valueو input_value. وبينما يتم فحص النوع بشكل ثابت في برمجة OCaml، فإن استخدامات الوحدة Marshalقد تكسر ضمانات النوع، حيث لا توجد طريقة للتحقق مما إذا كان التدفق غير المجمع يمثل كائنات من النوع المتوقع. في OCaml من الصعب تجميع دالة أو بنية بيانات تحتوي على دالة (على سبيل المثال كائن يحتوي على طريقة)، لأنه لا يمكن نقل التعليمات البرمجية القابلة للتنفيذ في الوظائف عبر برامج مختلفة. (يوجد علم لتجميع موضع التعليمات البرمجية للوظيفة ولكن لا يمكن إلغاء تجميعها إلا في نفس البرنامج بالضبط). يمكن لوظائف التجميع القياسية الحفاظ على المشاركة ومعالجة البيانات الدورية، والتي يمكن تكوينها بواسطة علم.
بيرل
توفر العديد من وحدات Perl المتوفرة من CPAN آليات التسلسل، بما في ذلك Storableو JSON::XSو FreezeThaw. يتضمن Storable وظائف لتسلسل وإلغاء تسلسل هياكل بيانات Perl من وإلى الملفات أو وحدات Perl القياسية. بالإضافة إلى التسلسل مباشرة إلى الملفات، Storableيتضمن freezeوظيفة لإرجاع نسخة متسلسلة من البيانات المعبأة في وحدة قياسية، وإلغاء thawتسلسل مثل هذه الوحدة القياسية. يعد هذا مفيدًا لإرسال بنية بيانات معقدة عبر مقبس شبكة أو تخزينها في قاعدة بيانات. عند تسلسل الهياكل باستخدام Storable، توجد وظائف آمنة للشبكة تخزن بياناتها دائمًا بتنسيق يمكن قراءته على أي جهاز كمبيوتر بتكلفة بسيطة للسرعة. تسمى هذه الوظائف و nstoreو nfreezeوما إلى ذلك. لا توجد وظائف "n" لإلغاء تسلسل هذه الهياكل - الهياكل العادية thawووحدات retrieveإلغاء التسلسل المتسلسلة باستخدام nوظائف " " وما يعادلها على جهاز معين.
بي اتش بي
لقد طبقت PHP في الأصل التسلسل من خلال الوظائف المدمجة serialize()و unserialize(). [27] يمكن لـ PHP تسلسل أي من أنواع البيانات باستثناء الموارد (مؤشرات الملفات والمنافذ وما إلى ذلك). غالبًا ما تكون الوظيفة المدمجة unserialize()خطيرة عند استخدامها على بيانات غير موثوقة تمامًا. [28] بالنسبة للكائنات، هناك " طريقتان سحريتان " يمكن تنفيذهما داخل فئة - __sleep()و __wakeup() - يتم استدعاؤهما من داخل serialize()و unserialize()، على التوالي، والتي يمكنها تنظيف واستعادة الكائن. على سبيل المثال، قد يكون من المرغوب فيه إغلاق اتصال قاعدة البيانات عند التسلسل واستعادة الاتصال عند إلغاء التسلسل؛ سيتم التعامل مع هذه الوظيفة في هاتين الطريقتين السحريتين. كما تسمح للكائن باختيار الخصائص التي يتم تسلسلها. منذ PHP 5.1، توجد آلية تسلسل موجهة للكائنات، الواجهة Serializable. [29]
برولوج
يمكن تسلسل بنية المصطلحات في لغة Prolog ، والتي تعد بنية البيانات الوحيدة للغة، من خلال المسند المدمج write_term/3وتسلسلها من خلال المسندات المدمجة read/1و read_term/2. ويكون الدفق الناتج عبارة عن نص غير مضغوط (في بعض الترميز الذي يتم تحديده من خلال تكوين الدفق المستهدف)، مع تمثيل أي متغيرات حرة في المصطلح بأسماء متغيرات مؤقتة. write_term/3ويتم توحيد المسند في مواصفات ISO الخاصة بلغة Prolog (ISO/IEC 13211-1) على الصفحات 59 وما يليها ("كتابة مصطلح، § 7.10.5"). لذلك فمن المتوقع أن المصطلحات التي تم تسلسلها من خلال أحد التطبيقات يمكن تسلسلها من خلال تطبيق آخر دون غموض أو مفاجآت. وفي الممارسة العملية، قد تستخدم الامتدادات الخاصة بالتطبيق (مثل قواميس SWI-Prolog) هياكل مصطلحات غير قياسية، وبالتالي قد تنكسر قابلية التشغيل المتبادل في الحالات الهامشية. على سبيل المثال، راجع صفحات الدليل المقابلة لـ SWI-Prolog، [30] SICStus Prolog، [31] GNU Prolog. [32] ما إذا كانت المصطلحات التسلسلية التي تم استلامها عبر الشبكة يتم فحصها وفقًا لمواصفات معينة (بعد حدوث إلغاء التسلسل من مجرى الأحرف) وكيفية فحصها متروكة للمنفذ. يمكن تطبيق
قواعد الجملة المحددة المضمنة في Prolog في تلك المرحلة.
بايثون
آلية التسلسل العامة الأساسية هي وحدة pickle المكتبة القياسية ، في إشارة إلى مصطلح أنظمة قواعد البيانات التخليل [33] [34] [35] لوصف تسلسل البيانات ( إلغاء التخليل لإلغاء التسلسل ). يستخدم Pickle آلة افتراضية بسيطة تعتمد على المكدس تسجل التعليمات المستخدمة لإعادة بناء الكائن. إنه تنسيق تسلسل قابل للتخصيص عبر الإصدارات ولكنه غير آمن (غير آمن ضد البيانات الخاطئة أو الضارة). قد تتسبب البيانات المشوهة أو التي تم إنشاؤها بشكل ضار في قيام برنامج إلغاء التسلسل باستيراد وحدات عشوائية وإنشاء أي كائن. [36] [37] تتضمن المكتبة القياسية أيضًا وحدات تسلسل إلى تنسيقات بيانات قياسية: (مع دعم مدمج لأنواع قياسية ومجموعات أساسية وقادرة على دعم أنواع عشوائية عبر خطافات الترميز وفك التشفير). (مع دعم لكل من تنسيقات قائمة خصائص الثنائية وXML ). (مع دعم لمعيار تمثيل البيانات الخارجية (XDR) كما هو موضح في RFC 1014). أخيرًا، يوصى بأن يكون الكائن قابلاً للتقييم في البيئة المناسبة، مما يجعله تطابقًا تقريبيًا لـ Common Lisp's . لا يمكن تخليل جميع أنواع الكائنات تلقائيًا، وخاصة تلك التي تحتوي على موارد نظام التشغيل مثل مقابض الملفات ، ولكن يمكن للمستخدمين تسجيل وظائف "اختزال" وبناء مخصصة لدعم التخليل وإلغاء التخليل للأنواع التعسفية. تم تنفيذ Pickle في الأصل كوحدة نمطية نقية من Python ، ولكن في إصدارات Python قبل 3.0، توفر الوحدة النمطية (المضمنة أيضًا) أداءً محسنًا (أسرع حتى 1000 مرة [36] ). تم تكييف Pickle من مشروع Unladen Swallow . في Python 3، يجب على المستخدمين دائمًا استيراد الإصدار القياسي، والذي يحاول استيراد الإصدار المعجل والعودة إلى إصدار Python النقي. [38]jsonplistlibxdrlib__repr__print-objectpicklecPicklecPickle
ر
تحتوي لغة R على وظيفة dputتكتب تمثيلًا نصيًا بتنسيق ASCII لكائن R إلى ملف أو اتصال. يمكن قراءة التمثيل من ملف باستخدام dget. [39] وبشكل أكثر تحديدًا، تقوم الوظيفة serializeبتسلسل كائن R إلى اتصال، ويكون الناتج عبارة عن متجه خام مشفر بتنسيق سداسي عشري. unserializeتسمح الوظيفة بقراءة كائن من اتصال أو متجه خام. [40]
ريبول
سيقوم REBOL بالتسلسل إلى ملف ( save/all) أو إلى string!( mold/all). يمكن إلغاء تسلسل السلاسل والملفات باستخدام الدالة المتعددة الأشكال load . RProtoBufيوفر تسلسل البيانات عبر اللغات في R، باستخدام Protocol Buffers . [41]
روبي
تتضمن لغة Ruby الوحدة النمطية القياسية Marshalبطريقتين dumpو load، على غرار أدوات يونكس القياسية dumpو restore. تتسلسل هذه الطرق إلى الفئة القياسية String، أي أنها تصبح فعليًا تسلسلًا من البايتات. لا يمكن تسلسل بعض الكائنات (سيؤدي القيام بذلك إلى إثارة TypeErrorاستثناء): الارتباطات وكائنات الإجراءات ومثيلات فئة الإدخال والإخراج والكائنات الفردية والواجهات. إذا كانت الفئة تتطلب تسلسلًا مخصصًا (على سبيل المثال، تتطلب إجراءات تنظيف معينة تتم عند الإغراق / الاستعادة)، فيمكن القيام بذلك عن طريق تنفيذ طريقتين: _dumpو _load. يجب أن تعيد طريقة المثيل كائنًا يحتوي على جميع المعلومات اللازمة لإعادة تكوين كائنات هذه الفئة وجميع الكائنات المرجعية حتى أقصى عمق يتم إعطاؤه كمعلمة عدد صحيح (قيمة -1 تعني أنه يجب تعطيل التحقق من العمق). يجب أن تأخذ طريقة الفئة a وتعيد كائنًا من هذه الفئة.
_dumpString _loadString
الصدأ
Serdeهي المكتبة أو الصندوق الأكثر استخدامًا على نطاق واسع للتسلسل في Rust .
محادثة قصيرة
بشكل عام، يمكن تخزين واسترجاع الكائنات غير المتكررة وغير المشتركة في شكل يمكن قراءته من قبل البشر باستخدام بروتوكول 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 [42] وبعض حزم RPC . الحل لهذه المشكلة هو SIXX، [43] وهي حزمة لتطبيقات Smalltalk متعددة تستخدم تنسيقًا قائمًا على XML للتسلسل الهرمي.
سويفت
توفر مكتبة Swift القياسية بروتوكولين، Encodableو Decodable(مكونان معًا كـ Codable)، مما يسمح بتسلسل أو إلغاء تسلسل مثيلات الأنواع المطابقة من JSON أو قوائم الخصائص أو التنسيقات الأخرى. [44] يمكن للمترجم إنشاء تنفيذات افتراضية لهذه البروتوكولات للأنواع التي تكون خصائصها المخزنة أيضًا Decodableأو Encodable.
باورشيل
ينفذ PowerShell التسلسل من خلال cmdlet المضمنةExport-CliXML . Export-CliXMLيتسلسل كائنات .NET ويخزن XML الناتج في ملف. لإعادة تكوين الكائنات، استخدم Import-CliXMLcmdlet، الذي ينشئ كائنًا غير متسلسل من XML في الملف المُصدَّر. الكائنات غير التسلسلية، والمعروفة غالبًا باسم "حقائب الخصائص"، ليست كائنات حية؛ فهي لقطات بها خصائص، ولكن ليس بها طرق. يمكن أيضًا (إلغاء) تسلسل هياكل البيانات ثنائية الأبعاد بتنسيق CSV باستخدام cmdlet المضمنة Import-CSVو Export-CSV.
انظر أيضا
- التبديل (القياس عن بعد)
- مقارنة بين تنسيقات تسلسل البيانات
- تنسيق الحاوية
- السبات (جافا)
- مخطط XML
- قواعد الترميز الأساسية
- مخازن بروتوكول جوجل
- قاعدة بيانات الويكي
- أباتشي أفرو
مراجع
- ^ كلاين، مارشال. "C++ FAQ: ""ما هو هذا الشيء ""التسلسلي""؟"". مؤرشف من الأصل في 2015-04-05.
يتيح لك أخذ كائن أو مجموعة من الكائنات، ووضعها على قرص أو إرسالها عبر آلية نقل سلكية أو لاسلكية، ثم في وقت لاحق، ربما على جهاز كمبيوتر آخر، عكس العملية، وإحياء الكائن (الكائنات) الأصلي (الأصلي). الآليات الأساسية هي تسطيح الكائن (الكائنات) إلى تيار أحادي البعد من البتات، وتحويل هذا التيار من البتات مرة أخرى إلى الكائن (الكائنات) الأصلي (الأصلي).
- ^ "Module: Marshal (Ruby 3.0.2)". ruby-doc.org . تم الاسترجاع في 25 يوليو 2021 .
- ^ ab "Marshal". OCaml . تم الاسترجاع في 25 يوليو 2021 .
- ^ "وثائق Python 3.9.6 - تسلسل كائنات Python —pickle". الوثائق - مكتبة Python القياسية .
- ^ S. Miller, Mark. "Safe Serialization Under Mutual Suspicion". ERights.org .
التسلسل، كما هو موضح أدناه، هو مثال لأداة يمكن استخدامها من قبل الكائنات داخل نظام كائنات للعمل على الرسم البياني المضمن فيها. يبدو أن هذا يتطلب انتهاك التغليف الذي يوفره نموذج الكائن النقي.
- ^ Sun Microsystems (1987). "XDR: معيار تمثيل البيانات الخارجية". RFC 1014. Network Working Group . تم الاسترجاع في 11 يوليو 2011 .
- ^ "التسلسل". www.boost.org .
- ^ بيل، ستيفان. "s11n.net: التسلسل/الاستمرارية للكائنات في C++". s11n.net .
- ^ "cereal Docs - Main". uscilab.github.io .
- ^ "ترميز الحزمة". pkg.go.dev . 12 يوليو 2021.
- ^ "GitHub - دعم YAML للغة Go". GitHub . تم الاسترجاع في 25 يوليو 2021 .
- ^ "proto · pkg.go.dev". pkg.go.dev . تم الاسترجاع في 2021-06-22 .
- ^ "حزمة gob - encoding/gob - pkg.go.dev". pkg.go.dev . تم الاسترجاع في 2022-03-04 .
- ^ "Text.Show Documentation" . تم الاسترجاع في 15 يناير 2014 .
- ^ بلوخ، جوشوا (2018). "دليل لغة البرمجة الفعالة جافا" (الطبعة الثالثة). أديسون ويسلي. رقم ISBN 978-0134685991.
- ^ "اسأل TOM "تسلسل كائنات Java في قاعدة البيانات (و..."". asktom.oracle.com .
- ^ "JSON". MDN Web Docs . تم الاسترجاع في 22 مارس 2018 .
- ^ "JSON". www.json.org . تم الاسترجاع في 22 مارس 2018 .
- ^ Holm, Magnus (15 May 2011). "JSON: The JavaScript subset that isn't". The timeless repository. مؤرشف من الأصل في 13 مايو 2012. تم الاسترجاع في 23 سبتمبر 2016 .
- ^ "اقتراح TC39: تضمين JSON". لجنة ECMA TC39. 22 مايو 2018.
- ^ "التسلسل". لغة جوليا . تم الاسترجاع في 25 يوليو 2021 .
- ^ "تسلسل أسرع وأكثر إحكاما للرموز والسلاسل · JuliaLang/julia@bb67ff2". GitHub .
- ^ "HDF5.jl: حفظ وتحميل البيانات بتنسيق ملف HDF5". 20 أغسطس 2017 – عبر GitHub.
- ^ "جوليا: ما مدى استقرار serialize() / deserialize()". stackoverflow.com . 2014.
- ^ ".NET Serializers".
هناك العديد من أنواع المسلسلات؛ فهي تنتج بيانات مضغوطة للغاية وبسرعة كبيرة. هناك مسلسلات لإرسال الرسائل، ولمخازن البيانات، ولتنظيم الكائنات. ما هو أفضل مسلسل في .NET؟
- ^ "SERBENCH بواسطة aumcode". aumcode.github.io .
- ^ "PHP: تسلسل الكائنات - دليل". ca.php.net .
- ^ Esser, Stephen (2009-11-28). "Shocking News in PHP Exploitation". Suspekt.. . مؤرشف من الأصل في 2012-01-06.
- ^ "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.
- ^ Birrell, Andrew; Jones, Mike; Wobber, Ted (November 1987). "تطبيق بسيط وفعال لقاعدة بيانات صغيرة". وقائع ندوة ACM الحادية عشرة حول مبادئ أنظمة التشغيل - SOSP '87 . المجلد 11. ص 149-154. CiteSeerX 10.1.1.100.1457 . doi :10.1145/41457.37517. ISBN 089791242X. ISSN 0163-5980. OCLC 476062921. S2CID 12908261.
يستخدم تنفيذنا آلية تسمى "pickles"، والتي ستحول بين أي بنية بيانات ذات نوع قوي وتمثيل لتلك البنية مناسب للتخزين في ملفات القرص الدائمة. تأخذ عملية Pickle.Write مؤشرًا إلى بنية بيانات ذات نوع قوي وتسلم مخازن مؤقتة من البتات للكتابة على القرص. وعلى العكس من ذلك، تقرأ Pickle.Read مخازن مؤقتة من البتات من القرص وتسلم نسخة من بنية البيانات الأصلية.(*) يتضمن هذا التحويل تحديد حدوث العناوين في البنية، وترتيب استبدال العناوين بعناوين صالحة في بيئة التنفيذ الحالية عند قراءة البنية مرة أخرى من القرص. آلية pickle آلية بالكامل: فهي مدفوعة بهياكل الكتابة وقت التشغيل الموجودة لآلية جمع القمامة الخاصة بنا. ... (*) تشبه عملية pickling مفهوم التجميع في استدعاءات الإجراءات عن بُعد. ولكن في الواقع، لا يعمل تنفيذنا لعملية التخليل إلا من خلال تفسير بنية القيم المكتوبة ديناميكيًا في وقت التشغيل ، بينما يعمل تنفيذنا لـ RPC فقط من خلال إنشاء كود لتجميع القيم المكتوبة بشكل ثابت. وسوف تستفيد كل منشأة من إضافة آليات المنشأة الأخرى، ولكن هذا لم يتم حتى الآن.
- ^ van Rossum, Guido (1 December 1994). "Flattening Python Objects". Python Programming Language – Legacy Website . Delaware , United States: Python Software Foundation . تم الاسترجاع في 6 أبريل 2017 .
أصل اسم "flattening": لأنني أريد ترك وحدة "marshal" الأصلية كما هي، واشتكى جيم من أن "التسلسل" يعني أيضًا شيئًا مختلفًا تمامًا وهو ذو صلة فعليًا في سياق الوصول
المتزامن
إلى الكائنات الدائمة، فسأستخدم مصطلح "flattening" من الآن فصاعدًا. ... (يستخدم نظام Modula-3 مصطلح "البيانات المخللة" لهذا المفهوم. ربما قاموا بحل جميع المشكلات بالفعل، وبطريقة آمنة للنوع :-)
- ^ ab "11.1. pickle — تسلسل كائنات Python — توثيق Python 2.7.14rc1". docs.python.org .
- ^ "pickle — تسلسل كائنات Python — توثيق Python v3.0.1". docs.python.org .
- ^ "ما الجديد في Python 3.0 — توثيق Python v3.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]
- ^ Eddelbuettel, Dirk; Stokely, Murray; Ooms, Jeroen (2014). "RProtoBuf: تسلسل بيانات فعال عبر اللغات في R". مجلة البرمجيات الإحصائية . 71 (2). arXiv : 1401.7372 . doi : 10.18637/jss.v071.i02 . S2CID 36239952.
- ^ "MinneStore version 2". SourceForge . مؤرشف من الأصل في 11 مايو 2008.
- ^ "ما الجديد". SIXX - Smalltalk Instance eXchange in XML . 23 يناير 2010 . تم الاسترجاع في 25 يوليو 2021 .
- ^ "Swift Archival & Serialization". www.github.com . 2018-12-02.
روابط خارجية
- توثيق التسلسل الكائني في Java
- توثيق التسلسل الكائني في Java 1.4.
- Java المتينة: التسلسل محفوظ في 25 نوفمبر 2005 على موقع Wayback Machine
- موارد ربط بيانات XML
- لوحة البيانات - التسلسل الثنائي مع الوصول الجزئي والعشوائي، ونظام النوع، وRPC، وتكييف النوع، وتنسيق النص
