واجهة قابلة للتسلسل في Java مع أمثلة
نشرت: 2021-11-29تقدم Java العديد من الحزم ، منها واجهة Serializable واحدة. إنه موجود في حزمة Java java.io وهو نوع من واجهة العلامة. عند تعريفها على أنها واجهة علامة ، لا توجد طرق أو حقول موجودة في الواجهة. لذلك ، عندما تقوم أي فئات بتنفيذ الواجهة ، فإن الواجهة غير مطلوبة لتنفيذ أي طرق. تقوم الفئات بتنفيذ الواجهة إذا أراد الفصل أن يتم إجراء تسلسل لمثيلاتها أو إلغاء تسلسلها.
يتم استخدام آلية التسلسل لتحويل حالة الكائن إلى دفق من البايت. يتم تنفيذ هذه الآلية باستخدام ObjectOutputStream. عملية إلغاء التسلسل هي عكس عملية التسلسل. في هذه الحالة ، يتم تحويل دفق البايت مرة أخرى إلى كائن Java. يتم استخدام ObjectInputStream لإلغاء التسلسل.
جدول المحتويات
التسلسل
يُعرف تحويل حالة أي كائن إلى دفق من البايت باسم التسلسل. وعكس التسلسل هو إلغاء التسلسل. يمكن تحويل كائن Java إلى دفق من البايتات الثابتة. يمكن بعد ذلك حفظ هذا التدفق الثابت في قاعدة بيانات ، أو يمكن أيضًا نقله إلى شبكة مختلفة. تعتمد عملية التسلسل على المثيل. هذا يعني أنه يمكن إجراء تسلسل الكائنات على منصة واحدة ، ومن ثم يمكن تنفيذ إلغاء تسلسل الكائنات على منصة أخرى. يتم تنفيذ نوع معين من واجهة العلامة ، "Serializable" ، لعملية التسلسل. لذلك ، يجب أن تقوم الفئات المؤهلة للتسلسل ، أي الفئة القابلة للتسلسل في Java ، بتنفيذ واجهة العلامة.
تُعرف آلية كتابة حالة الكائن في دفق من البايت بالتسلسل. تُستخدم الآلية بشكل أساسي في تقنيات JMS و EJB و JPA و RMI و Hibernate.
ObjectInputStream و ObjectOutputStream هما شكلان من الفئات عالية المستوى التي توسع java.io.InputStream و java.io.OutputStream. يمكن كتابة الأنواع الأولية والرسوم البيانية للكائن إلى OutputStream بواسطة ObjectOutputStream في بايت
مجرى. يمكن قراءة الدفق الناتج عن التحويل من خلال ObjectInputStream. لذلك ، بالنسبة للتسلسل ، يتم استدعاء الأسلوب writeObject () من ObjectOutputStream ولإلغاء التسلسل ، يتم استدعاء الأسلوب readObject () من فئة ObjectInputStream.
الطريقة الأكثر أهمية في ObjectOutputStream هي:
السطر أعلاه من الكود مأخوذ من https://www.baeldung.com/java-serialization.
في سطر التعليمات البرمجية أعلاه ، يتم أخذ كائن قابل للتسلسل ، ثم يتم تحويله إلى دفق أو دفق من البايت.
في حالة ObjectInputStream ، فإن الطريقة الأكثر أهمية هي:
السطر أعلاه من الكود مأخوذ من https://www.baeldung.com/java-serialization.
يمكن لسطر الكود أعلاه قراءة تسلسل البايتات وتحويل دفق البايت هذا إلى كائن Java. يمكن إعادة الكائن الأصلي من خلال هذا.
يمكن وصف توضيح لعملية التسلسل أدناه:
تعتبر فئة "الشخص" للتسلسل. الحقول الثابتة غير متسلسلة ، وهي تنتمي إلى بعض الفئات. يمكن تجاهل حقول الفئة باستخدام الكلمة الأساسية "عابر" في عملية التسلسل.
مصدر
يمكن حفظ كائن نوع الشخص في ملف محلي ، ثم تتم قراءة القيمة مرة أخرى. يمكن استخدام الكود الموضح أدناه لهذا الغرض.
تم استخدام ObjectOutputStream لحفظ حالة الكائن في ملف من خلال استخدام FileOutputStream. في هذا المثال ، تم إنشاء ملف باسم "yourfile.txt" في دليل المشروع. من خلال استخدام FileInputStream ، يتم تحميل الملف الذي تم إنشاؤه. يتم التقاط هذا الدفق بعد ذلك بواسطة ObjectInputStream ويتم تحويله إلى كائن جديد باسم p2. يتم أخيرًا اختبار حالة الكائن الذي تم تحميله ، ويتم مطابقتها مع حالة الكائن الأصلي. يجب إرسال الكائن الذي يتم تحميله بشكل صريح إلى الشخص العادي.
المحاذير في تسلسل جافا
1. الميراث والتكوين
عندما يقوم المستخدم بتنفيذ الواجهة java.io.Serializable ، تصبح جميع فئات الفئات الفرعية التي تنفذ الواجهة قابلة للتسلسل. أيضًا ، إذا كان الكائن يحتوي على مرجع إلى كائن مختلف ، فإن الكائنات المشار إليها لتنفيذ الواجهة قابلة للتسلسل بشكل منفصل ؛ إذا لم تنفذ هذه الكائنات الواجهة ، فسيتم استبعاد استثناء. سيكون الاستثناء الذي تم طرحه هو NotSerializableException. أيضًا ، إذا افترضنا أن مجموعة من العناصر مخزنة في كائن قابل للتسلسل ، فيجب إجراء تسلسل لجميع كائنات المصفوفة. إذا لم يحدث تسلسل للكائنات ، فسيؤدي ذلك إلى طرح الاستثناء "NotSerializableException."
2. الإصدار التسلسلي UID
لكل فئة تنفذ واجهة Serializable ، يرتبط رقم بكل فئة من الفئات. الرقم مرتبط بـ Java Virtual Machine. يتم ذلك بشكل أساسي للتحقق من أن الكائنات التي يتم تحميلها وحفظها لها السمات الدقيقة. فقط إذا كانت السمات هي نفسها ، فستكون الكائنات متوافقة عند التسلسل. تنشئ IDE هذه الأرقام تلقائيًا وتستند بشكل أساسي إلى أسماء الفئة وسماتها ومعدلات الوصول المرتبطة بها. سيتم طرح استثناء ، "InvalidClassException" ، إذا نتج رقم مختلف عن التغييرات.
إذا لم يتم التصريح عن serialVersionUID بواسطة فئة قابلة للتسلسل ، فسيقوم JVM تلقائيًا بإنشائه أثناء وقت التشغيل. على الرغم من أنه سيكون هناك إنشاء تلقائي للرقم ، إلا أنه لا يزال من المستحسن أن تعلن الفئات عن serialVersionUID. هذا لأن serialVersionUID ، الذي سيتم إنشاؤه تلقائيًا ، سيعتمد على المترجم وقد يؤدي أحيانًا إلى طرح InvalidClassExceptions بشكل غير متوقع.
3. التسلسل المخصص
تم تعيين طريقة افتراضية في Java لتسلسل الكائنات. يمكن أن تتجاوز Java هذا السلوك الافتراضي. هناك طريقة للتسلسل المخصص. إنه مفيد بشكل خاص في الحالات التي تتم فيها محاولة إجراء تسلسل للكائن الذي يحتوي على سمات غير قابلة للتسلسل. يمكن إجراء التسلسل لمثل هذه الكائنات من خلال طريقتين داخل فئة يريد المستخدم إجراء تسلسل لها. هاتان الطريقتان هما:
يمكن استخدام الطريقتين المذكورتين أعلاه لتسلسل السمات إلى أي نماذج يمكن إجراء تسلسل لها ، والتي كانت غير قابلة للتسلسل سابقًا.
مزايا التسلسل في جافا
تتمثل إحدى مزايا التسلسل في Java في إمكانية انتقال حالة الكائن عبر الشبكة.
واجهة جافا java.io.Serializable
java.io.Serializable هي واجهة علامة مما يعني أنه لا توجد طرق وكائنات داخل الواجهة. تتمثل الوظيفة الأساسية لواجهة العلامة في تحديد ملف
فئات Java لإعطاء قدرة خاصة لجميع كائنات الفئات. أمثلة على واجهات العلامات هي Remote و Cloneable.
يجب أن يتم تنفيذ الواجهة بواسطة أي فئة تستخدم الواجهة لتسلسل كائناتها. بشكل افتراضي ، تقوم الفئات مثل فئات المجمّع وفئة السلسلة بتنفيذ الواجهة java.io.Serializable.
يظهر مثال جافا القابل للتسلسل أدناه.
في الكود أعلاه ، يمكن ملاحظة أن الفصل Student يقوم بتنفيذ الواجهة Serializable. لذلك بمجرد تنفيذ الفئة للواجهة Serializable ، يمكن تحويل الكائنات الموجودة داخل الفئة إلى وحدات بايت من الدفق.
فئة ObjectOutputStream
تُستخدم هذه الفئة لكتابة الأنواع الأولية من البيانات وكائنات Java في OutputStream. يمكن استخدام الكائن الذي يدعم الواجهة java.io.Serializable ليتم كتابته في التدفقات.
فئة ObjectInputStream
يتم إلغاء تسلسل جميع البيانات الأولية التي تمت كتابتها من خلال استخدام ObjectOutputStream باستخدام ObjectInputStream.
يظهر أدناه مثال على واجهة Serializable في Java.
في هذا المثال ، سيتم إجراء تسلسل للفصل الدراسي Student. يوفر الأسلوب writeObject () الخاص بالفئة ObjectOutputStream كافة الوظائف لتسلسل الكائنات. يتم حفظ حالة الكائن في ملف باسم f.txt.
الاستنتاجات
ناقش المقال مفهوم التسلسل في Java. أدرجت الواجهات والأساليب المهمة الأخرى المطلوبة لتسلسل كائنات الفصل. ترتبط عملية التسلسل دائمًا بمعرف أو رقم مع كل فئة قابلة للتسلسل. يشار إلى هذا الرقم باسم SerialVersionUID. الاستخدام الرئيسي لـ SerialVersionUID هو التحقق من المرسل والمستقبل للكائن الذي سيتم إجراء تسلسل له. هذا لأن كلاً من المرسل والمتلقي يجب أن يكونا متماثلين.
إنها ميزة مهمة في لغة البرمجة Java. إذا كنت تريد معرفة المزيد عن هذه الميزات والمفاهيم المهمة في Java وإتقان مهارات لغة البرمجة ، يمكنك التحقق من دورات هندسة البرمجيات التي تقدمها upGrad. إذا كنت محترفًا عاملاً ، فإن الدورة التدريبية هي الأنسب لك. لأي شكل من أشكال الاستفسارات ، يمكن الاتصال بفريق المساعدة لدينا. يمكنك أيضًا تصفح موقعنا على الإنترنت للحصول على الدورة التدريبية المحددة والحصول على معلومات مفصلة. الواجهة القابلة للتسلسل هي واجهة علامة. توفر واجهة العلامة تلميحًا إلى وقت تشغيل Java حيث تسمح فئة التنفيذ لنفسها بالتسلسل. سيستفيد وقت التشغيل من هذه الواجهة لإجراء تسلسل للكائن. الواجهة التسلسلية في جافا هي واجهة خاصة يتم تنفيذها بواسطة فئات البيانات في جافا. عندما تنفذ فئة هذه الواجهة ، يمكن أن تستمر في قاعدة بيانات. تم إعلان هذه الواجهة في حزمة java.io. تحتوي الواجهة القابلة للتسلسل على طريقتين ، readResolve () و writeReplace () ، تُستخدمان لقراءة الكائن وكتابته في قاعدة البيانات. يعني تنفيذ واجهة Serializable في Java أن يكون لديك كائن يمكن إجراء تسلسل له وإلغاء تسلسله في أي نظام به واجهة Serializable. سيكون تنفيذ هذه الواجهة فعالاً عندما يتم إجراء تسلسل للفئة خارجيًا بواسطة مكتبات الطرف الثالث (JSON ، XML ، إلخ) أو عن طريق بروتوكولات الشبكة. عندما يتم التصريح عن متغير بأنه قابل للتسلسل ، فسيتم إجراء تسلسل لكل مثيل من المتغير وإلغاء تسلسله إذا تم تمريره كمعامل إلى طريقة أو عند إرجاعه من طريقة. يتم تنفيذ التسلسل برمجيًا بحيث يمكن الاحتفاظ بحالة الكائن لوقت لاحق ، عندما يلزم إلغاء تسلسلها وتقديمها إلى مستخدم الكائن. الكائن المتسلسل هو كائن يحتوي على دفق من البايت. تُستخدم أساليب مُنشئ الكائن أو writeObject () / readObject () لوضع دفق البايت في الكائن. قد تكون البيانات المخزنة نصية أو صوتية أو فيديو أو أي بيانات تطبيق مخصصة. قد يتم تخزين بيانات هذه الكائنات في ملف أو على خادم بعيد. لنقل كائنات متسلسلة عبر الشبكة ، يجب على المرء استخدام بروتوكول RMI (استدعاء الطريقة البعيدة). RMI هو بروتوكول جيد لإنشاء تطبيقات موزعة. إنه يمكّن العميل من الاتصال بالطرق على الكائنات في تطبيق Java يعمل على الخادم. بروتوكول RMI هو آلية استدعاء الإجراءات عن بعد (RPC). ما هي الواجهة القابلة للتسلسل في Java؟
ماذا يحدث إذا قمنا بتطبيق واجهة Serializable في Java؟
هل يمكننا نقل كائن متسلسل عبر الشبكة؟