ما هو مفهوم التسلسل في جافا؟



ستساعد هذه المقالة في اتباع نهج شامل تجاه مفهوم التسلسل في Java مع أمثلة في الوقت الفعلي لفهم أفضل.

التسلسل بتنسيق هو مفهوم مهم يتعامل مع تحويل الكائنات إلى دفق بايت لنقل كائنات جافا من جهاز ظاهري Java إلى الآخر وإعادة إنشائها إلى النموذج الأصلي. سأصطف جدول هذه المقالة على النحو التالي:

ما هو التسلسل في جافا؟

التسلسل في Java هي عملية تحويل كود Java موضوع الى بايت تيار ، لنقل كود الكائن من جهاز Java Virtual إلى آخر وإعادة إنشائه باستخدام عملية إلغاء التسلسل.





Serialization-in-Java-Edureka-Picture-1

لماذا نحتاج التسلسل في جافا ؟

نحتاج إلى التسلسل للأسباب التالية:



  • الاتصالات : يتضمن التسلسل إجراء الكائن التسلسل و انتقال. يتيح ذلك لأنظمة كمبيوتر متعددة تصميم ومشاركة وتنفيذ الكائنات في وقت واحد.

  • التخزين المؤقت : الوقت المستغرق في بناء كائن أكثر مقارنة بالوقت اللازم لإلغاء تسلسله. التسلسل يقلل من استهلاك الوقت من خلال التخزين المؤقت الأجسام العملاقة.

  • نسخة عميقة : استنساخ عملية بسيطة باستخدام التسلسل. بالضبط نسخة مطابقة للأصل من كائن يتم الحصول عليها بواسطةتسلسل الكائن إلى مجموعة بايت ، ثم إلغاء تسلسلها.



  • تعبر تزامن JVM: الميزة الرئيسية للتسلسل هي أنهيعمل عبر JVMs المختلفة التي قد تعمل على مختلف معماريات أو أنظمة التشغيل

  • إصرار: يمكن تخزين حالة أي كائن مباشرة عن طريق تطبيق التسلسل عليه وتخزينها في ملف قاعدة البيانات بحيث يمكن أن يكون تم استرجاعه لاحقًا.

كيف نقوم بتسلسل كائن؟

إلى كائن جافا يكون قابل للتسلسل إذا وفقط إذا قامت فئتها أو أي من فئاتها الرئيسية بتنفيذ أي من جافا . أنا . المسلسل الواجهة أو واجهتها الفرعية ، java.io.Externalizable.

في عملية التسلسل ، نقوم بتحويل حالة الكائن إلى تدفق بايت بحيث يمكن نقله من JVM إلى الآخر وإعادة دفق البايت إلى الكائن الأصلي.

//واجهه المستخدم

package Serial1 import java.io.Serializable public class الموظف ينفذ المسلسل {private static final serialVersionUID = 1L // Serial Version UID int id ، String name public Employee (int id ، String name) {this.id = id this.name = name }}

// تسلسل

package Serial1 import java.io. * class Persist {public static void main (String args []) {try {Employee emp1 = new Employee (20110، 'John') Employee emp2 = new Employee (22110، 'Jerry') الموظف emp3 = موظف جديد (20120، 'Sam') FileOutputStream fout = new FileOutputStream ('output.txt') ObjectOutputStream out = new ObjectOutputStream (fout) out.writeObject (emp1) out.writeObject (emp2) out.writeObject (emp3) خارج. flush () out.close () System.out.println ('تم تنفيذ التسلسل وإلغاء التسلسل بنجاح')} catch (استثناء هـ) {System.out.println (e)}}}

انتاج:

تم تنفيذ التسلسل وإلغاء التسلسل بنجاح

إلغاء التسلسل : إنها العملية العكسية للتسلسل حيث يتم إعادة إنشاء دفق البايت المتسلسل لكائن من المرسل في الطرف المستلم.

// إلغاء التسلسل

package Serial1 import java.io. * class Depersist {public static void main (String args []) {try {ObjectInputStream in = new ObjectInputStream (new FileInputStream ('output.txt')) الموظف e1 = (الموظف) in.readObject ( ) الموظف e2 = (الموظف) in.readObject () الموظف e3 = (الموظف) in.readObject () System.out.println (e1.id + '' + e1.name) System.out.println (e2.id + ' + e2.name) System.out.println (e3.id + '' + e3.name) in.close ()} catch (استثناء e) {System.out.println (e)}}}

انتاج:

20110 يوحنا
22110 جيري

كيف ترفع إلى مستوى السلطة في جافا

20120 سام

مزايا وعيوب التسلسل في Java

مزايا:

  • عملية التسلسل هي أ مدمج الميزة التي لا تتطلب برنامج جهة خارجية لتنفيذ التسلسل
  • تم إثبات أن إجراء التسلسل بسيط و سهل لفهم

  • إجراء التسلسل هو عالمي والمطورين من خلفيات مختلفة مألوفون لها

  • إنه سهل الاستخدام و سهل التخصيص

  • تدفقات البيانات المتسلسلة دعم التشفير والضغط والمصادقة و تأمين حوسبة جافا

  • هنالك الكثير التقنيات الحرجة بالاعتماد على التسلسل.

سلبيات:

  • كائنات بينما يصبح DeSerialization هش وهم غير متأكدين من أن يتم DeSerialized بشكل فعال.

  • تم الإعلان عن المتغيرات العابرة أثناء إنشاء التسلسل مساحة ذاكرة ، ولكن لا يتم استدعاء المُنشئ مما يؤدي إلى فشل تهيئة المتغيرات العابرة مما يؤدي إلى الاختلاف في تدفق Java القياسي.

  • عملية التسلسل هي غير فعال من حيث استخدام الذاكرة.

  • لا يفضل استخدام التسلسل في التطبيقات التي تحتاج إليها الوصول المتزامن دون شرط واجهات برمجة تطبيقات الطرف الثالث ، حيث لا يقدم التسلسل أي آلية تحكم في الانتقال لكل SE.

  • فشل إجراء التسلسل تحكم دقيق للوصول إلى الكائنات.

أمثلة عملية عن التسلسل في جافا

التسلسل باستخدام الوراثة

الحالة - 1: إذا كانت الفئة الفائقة قابلة للتسلسل ، فإن الفئات الفرعية ، بشكل افتراضي ، قابلة للتسلسل أيضًا.

في هذه الحالة ، فإن فئة فرعية قابل للتسلسل افتراضيًا إذا كان الطبقة العليا يقوم بتنفيذ واجهة قابلة للتسلسل

package SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable class A implements Serializable {int i public A (int i) {this.i = i}} تمتد الفئة B A {int j public B (int i، int j) {super (i) this.j = j}} public class Test {public static void main (String [] args) يطرح الاستثناء {B b1 = new B (200،400) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = new FileOutputStream ('abc.ser') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('الكائن تم تسلسله') FileInputStream fis = FileInputStream الجديد ('abc.ser') ObjectInputStream ois = new ObjectInputStream (fis) B b2 = (B) ois.readObject () ois.close () fis.close () System.out.println ('تم إلغاء تسلسل الكائن') System.out.println ('i = '+ b2.i) System.out.println (' j = '+ b2.j)}}

انتاج:

ي = 20
تم إجراء تسلسل للكائن
تم إلغاء تسلسل الكائن
أنا = 200
ي = 400

الحالة - 2: يمكن إجراء تسلسل لفئة فرعية إذا كانت تنفذ الواجهة القابلة للتسلسل حتى إذا لم تقم فئة Superclass بتنفيذ الواجهة القابلة للتسلسل.

في هذه الحالة ، إذا كان الطبقة العليا لا يتم تنفيذ واجهة قابلة للتسلسل ، إذن ، كائنات فئة فرعية يمكن إجراء تسلسل يدويًا عن طريق تنفيذ الواجهة القابلة للتسلسل في الفئة الفرعية.

package SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable class superclass {int i public superclass (int i) {this.i = i} public superclass () {i = 50 System.out.println ('Superclass constructor يسمى')}} تمد الفئة الفرعية فئة superclass وتنفذ Serializable {int j public subclass (int i، int j) {super (i) this.j = j }} public class test2 {public static void main (String [] args) throws Exception {subclass b1 = new subclass (10، 20) System.out.println ('i =' + b1.i) System.out.println ( 'j =' + b1.j) FileOutputStream fos = new FileOutputStream ('output.ser') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('تم تسلسل الكائن') FileInputStream fis = FileInputStream الجديد ('output.ser') ObjectInputStream ois = فئة فرعية جديدة لـ ObjectInputStream (fis) b2 = (فئة فرعية) ois.readObject ( ) ois.close () fis.close () System.out.println ('تم إلغاء تسلسل الكائن') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

تم إجراء تسلسل للكائن
دعا مُنشئ Superclass
تم إلغاء تسلسل الكائن
أنا = 50
ي = 20

الحالة - 3: إذا كانت الفئة الفائقة قابلة للتسلسل ، لكننا لا نحتاج إلى إجراء تسلسل للفئة الفرعية.

في هذه الحالة ، يمكن منع تسلسل الفئة الفرعيةمن خلال تنفيذ writeObject () و readObject () الأساليب في الفئة الفرعية ويحتاج إلى رميها NotSerializableException من هذه الطرق.

package SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.IOException import java.io.NotSerializableException استيراد java.io.ObjectInputStream استيراد java.io.ObjectOutputStream استيراد java.io.Serializial classable implements i public Parent (int i) {this.i = i}} class child يمدد Parent {int j public child (int i، int j) {super (i) this.j = j} private void writeObject (ObjectOutputStream out) IOException {throw new NotSerializableException ()} readObject (ObjectInputStream in) باطل خاص يلقي IOException {throw new NotSerializableException ()}} public class test3 {public static void main (String [] args) exception {child b1 = new child (100، 200) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = new FileOutputStream ('abc.ser') ObjectOutputStream oos = new ObjectOutputStream ( fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('كائن تم تسلسله ') FileInputStream fis = new FileInputStream (' abc.ser ') ObjectInputStream ois = new ObjectInputStream (fis) الطفل b2 = (الطفل) ois.readObject () ois.close () fis.close () System.out. println ('تم إلغاء تسلسل الكائن') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

انتاج:

أنا = 100
ي = 200
استثناء في الموضوع 'الرئيسي' java.io.NotSerializableException
في SerializationInheritance.child.writeObject (test3.java:48)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (الطريقة الأصلية)

التسلسل باستخدام عضو ثابت

يتم تجاهل تسلسل حقل عضو ثابت في عملية التسلسل. التسلسل هوذات الصلة بأحدث حالة الكائن. ومن ثم ، فإن البيانات المرتبطة بمثيل معين للفئة هي فقطمتسلسل ولكن ليس حقل عضو ثابت.

استيراد sqoop من oracle إلى hdfs
package stati import java.io. * class StaticSerial تنفذ Serializable {static int i = 100 public static void main (String ... ar) {StaticSerial ob = new StaticSerial () System.out.println ('في وقت التسلسل ، العضو الثابت له قيمة: '+ i) جرب {FileOutputStream fos = new FileOutputStream (' F: File.ser ') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (ob) oos.close () i = 99 FileInputStream fis = FileInputStream الجديد ('F: File.ser') ObjectInputStream ois = new ObjectInputStream (fis) ob = (StaticSerial) ois.readObject () ois.close () System.out.println ('بعد إلغاء التسلسل ، يكون للعضو الثابت قيمة:' + i)} catch (استثناء هـ) {System.out.println (e)}}}

انتاج:

في وقت التسلسل ، العضو الثابت له قيمة: 100
بعد إلغاء التسلسل ، يكون للعضو الثابت قيمة: 99

واجهة خارجية

ال واجهة خارجية في Java يشبه Serialization ولكن الاختلاف الوحيد هو أنه قادر على العرض تسلسل مخصص حيث يمكنك تحديد العناصر المراد تلويثها في الدفق.

الواجهة الخارجية متوفرة في java.io وتوفر طريقتين:

  • يطرح writeExternal (ObjectOutput out) الباطلة العامة IOException
  • readExternal (إدخال الكائن في) باطل عام يلقي IOException

الاختلافات الرئيسية بين Serialization و Externalizeable هي كما يلي:

  • التنفيذ : واجهة خارجية باستثناء المستخدم صراحة اذكر الكائنات التي سيتم إجراء تسلسل لها. أثناء استخدام واجهة التسلسل ، يتم إجراء تسلسل لجميع الكائنات والمتغيرات في ملف مدة العرض.

  • طرق : تتكون الواجهة الخارجية من طريقتين ، وهما:

    • writeExternal ()

    • readExternal ()

حيث أن الواجهة القابلة للتسلسل لا تتضمن أي طرق.

  • معالجة: توفر عملية التسلسل في الواجهة الخارجية التخصيص لعملية التسلسل. ولكن ، ستوفر واجهة التسلسل ملف إفتراضي عملية التسلسل.

  • التوافق والتحكم مع الإصدارات السابقة: تدعم الواجهة الخارجية التحويل التسلسلي بغض النظر عن ملف التحكم في الإصدار والمشكلة الوحيدة هي أن المستخدم يجب أن يكون مسؤولاً أثناء إجراء تسلسل للفئة الفائقة. من ناحية أخرى ، تتطلب واجهة التسلسل ملف نفس الإصدار من JVMs على كلا الطرفين ولكنه يتضمن تسلسلًا تلقائيًا لجميع الكائنات والفئات بما في ذلك الطبقة الفائقة.

  • منشئ No-Arg العام: احتياجات واجهة التبرير منشئ No-Arg العام لإعادة بناء الكائن المتسلسل. بينما لا تتطلب واجهة التسلسل No-Arg Constructor ، فإنها تستخدم بدلاً من ذلك انعكاس لإعادة بناء الكائن أو الفئة المتسلسلة.

package ext import java.io. * class Demo implements java.io.Serializable {public int a public String b public Demo (int a، String b) {this.a = a this.b = b}} class Test {public static void main (String [] args) {Demo object = new Demo (1، 'Welcome to Edureka') String filename = 'file.ser' حاول {FileOutputStream file = new FileOutputStream (filename) ObjectOutputStream out = new ObjectOutputStream (ملف) خارج .writeObject (object) out.close () file.close () System.out.println ('Object has been serialized')} catch (IOException ex) {System.out.println ('IOException is caught')} Demo object1 = null حاول {FileInputStream file = new FileInputStream (filename) ObjectInputStream in = new ObjectInputStream (file) object1 = (Demo) in.readObject () in.close () file.close () System.out.println ('الكائن كان deserialized ') System.out.println (' a = '+ object1.a) System.out.println (' b = '+ object1.b)} catch (IOException ex) {System.out.println (' تم اكتشاف IOException ')} catch (ClassNotFoundException ex) {System.out .println ('تم اكتشاف ClassNotFoundException')}}}

كلمات رئيسية عابرة

الكلمات الرئيسية العابرة هي ملف كلمة رئيسية محجوزة في جافا. يتم استخدامه كملف تعديل متغير في وقت عملية التسلسل. إعلان متغير باستخدام كلمة أساسية عابرة يتجنب المتغير من أن يكون تسلسليًا.

UID الإصدار التسلسلي

قبل أن تبدأ عملية التسلسل ، يتم ربط كل فئة / كائن قابل للتسلسل بامتداد رقم تعريف فريد مقدمة من JVM للجهاز المضيف. هذا المعرف الفريد يسمى UID الإصدار التسلسلي . يتم استخدام UID هذا كتعريف بواسطة JVM للطرف المستلم لتأكيد أنه يتم إلغاء تسلسل الكائن نفسه عند الطرف المستلم.

الخلافات حول التسلسل في جافا

أوراكل يعتزم المهندسون المعماريون إزالة Serialization من Java لأنهم يعتبرونها ملف خطأ فظيع عام 1997 . بعد البحث المحموم ، اكتشف المطورون في Oracle بعض العيوب في تصميم إجراء التسلسل الذي يشكل تهديدًا للبيانات.

في عام 1997 ،يقول مارك رينهولد - ' نحب أن نطلق على التسلسل 'الهدية التي تستمر في العطاء' ، ونوع الهدية التي تستمر في تقديمها هو نقاط الضعف الأمنية. من المحتمل أن ثلث جميع ثغرات Java تتضمن تسلسلًا ، وقد يكون أكثر من النصف. إنه مصدر خصب بشكل مذهل لنقاط الضعف ، ناهيك عن عدم الاستقرار.

هناك احتمالات بإزالة أو استبدال التسلسل في تحديثات Java القادمة ومن ناحية أخرى ، بالنسبة للمبتدئين في Java ، Serialization لا يمكن كن خيارًا مثاليًا في مشاريعهم

أفضل الممارسات أثناء استخدام التسلسل في Java

فيما يلي بعض أفضل الممارسات التي يجب اتباعها

  • يوصى باستخدامه جافادوك @ علامة تسلسلية للدلالة على حقول Serializable.
  • ال .أن تكون يفضل استخدام الامتداد للملفات التي تمثل الكائنات المتسلسلة.
  • لا يوصى بالخضوع لأي حقول ثابتة أو عابرة التسلسل الافتراضي.
  • فصول قابلة للتمديد لا ينبغي أن يكون المسلسل ما لم يكن إلزامي.
  • الطبقات الداخلية يجب تجنب التورط في التسلسل.

بهذا نكون قد وصلنا إلى نهاية هذا المقال. أتمنى أن تكون قد فهمت أساسيات التسلسل في Java وأنواعها ووظائفها.

تفحص ال من Edureka ، وهي شركة تعليمية موثوقة عبر الإنترنت مع شبكة تضم أكثر من 250000 متعلم راضٍ منتشرين في جميع أنحاء العالم. تم تصميم دورة تدريب وشهادة Java J2EE و SOA من Edureka للطلاب والمهنيين الذين يرغبون في أن يصبحوا مطوري Java. تم تصميم الدورة التدريبية لمنحك السبق في برمجة Java وتدريبك على مفاهيم Java الأساسية والمتقدمة جنبًا إلى جنب مع العديد من أطر Java مثل Hibernate & ربيع .

لديك سؤال لنا؟ أذكرها في قسم التعليقات في مقالة 'Serialization in Java' وسنعاود الاتصال بك في أقرب وقت ممكن.