logo

التسلسل وإلغاء التسلسل في جافا

  1. التسلسل
  2. واجهة قابلة للتسلسل
  3. مثال على التسلسل
  4. مثال على إلغاء التسلسل
  5. التسلسل مع الميراث
  6. واجهة خارجية
  7. التسلسل وعضو البيانات الثابتة

التسلسل في جافا هي آلية كتابة حالة الكائن في دفق بايت . يتم استخدامه بشكل أساسي في تقنيات Hibernate و RMI و JPA و EJB و JMS.

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

لإجراء تسلسل للكائن، نسميه كائن الكتابة () طريقة ObjectOutputStream فئة، ولإلغاء التسلسل نسميه قراءة الكائن () طريقة ObjectInputStream فصل.

يجب علينا تنفيذ قابل للتسلسل واجهة لتسلسل الكائن.

مزايا تسلسل جافا

يتم استخدامه بشكل أساسي لنقل حالة الكائن على الشبكة (المعروف باسم التنظيم).

تسلسل جافا

واجهة java.io.Serializable

قابل للتسلسل هي واجهة علامة (لا تحتوي على عضو بيانات وطريقة). يتم استخدامه 'لتمييز' فئات Java بحيث تحصل كائنات هذه الفئات على قدرة معينة. ال قابل للاستنساخ و بعيد هي أيضًا واجهات علامة.

ال قابل للتسلسل يجب أن يتم تنفيذ الواجهة بواسطة الفئة التي يحتاج كائنها إلى الاستمرار.

سلسلة مقارنة ج #

تقوم فئة السلسلة وجميع فئات المجمع بتنفيذ java.io.Serializable الواجهة بشكل افتراضي.

دعونا نرى المثال الوارد أدناه:

Student.java

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

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

فئة ObjectOutputStream

يتم استخدام فئة ObjectOutputStream لكتابة أنواع البيانات البدائية وكائنات Java إلى OutputStream. يمكن فقط كتابة الكائنات التي تدعم واجهة java.io.Serializable إلى التدفقات.

البناء

1) يقوم ObjectOutputStream العام (OutputStream out) بطرح IOException {}يقوم بإنشاء ObjectOutputStream الذي يكتب إلى OutputStream المحدد.

طرق مهمة

طريقةوصف
1) كتابة الفراغ النهائي العام (Object obj) يلقي IOException {}يكتب الكائن المحدد إلى ObjectOutputStream.
2) يلقي الفراغ العام () IOException {}فإنه يمسح دفق الإخراج الحالي.
3) إغلاق الفراغ العام () يلقي IOException {}إنه يغلق دفق الإخراج الحالي.

فئة ObjectInputStream

يقوم ObjectInputStream بإلغاء تسلسل الكائنات والبيانات الأولية المكتوبة باستخدام ObjectOutputStream.

البناء

1) يقوم ObjectInputStream العام (InputStream in) بطرح IOException {}يقوم بإنشاء ObjectInputStream الذي يقرأ من InputStream المحدد.

طرق مهمة

طريقةوصف
1) الكائن النهائي العام readObject() يلقي IOException، ClassNotFoundException{}يقرأ كائنًا من دفق الإدخال.
2) إغلاق الفراغ العام () يلقي IOException {}يقوم بإغلاق ObjectInputStream.

مثال على تسلسل جافا

في هذا المثال، سنقوم بإجراء تسلسل للكائن طالب فئة من الكود أعلاه. توفر طريقة writeObject() لفئة ObjectOutputStream وظيفة إجراء تسلسل للكائن. نقوم بحفظ حالة الكائن في الملف المسمى f.txt.

Persist.java

 import java.io.*; class Persist{ public static void main(String args[]){ try{ //Creating the object Student s1 =new Student(211,'ravi'); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} } } 

انتاج:

حلقة جافا المحسنة
 success 
قم بتنزيل هذا المثال للتسلسل

مثال على إلغاء تسلسل جافا

إلغاء التسلسل هي عملية إعادة بناء الكائن من الحالة التسلسلية. إنها العملية العكسية للتسلسل. دعونا نرى مثالاً حيث نقرأ البيانات من كائن تم إلغاء تسلسله.

إلغاء التسلسل هي عملية إعادة بناء الكائن من الحالة التسلسلية. إنها العملية العكسية للتسلسل. دعونا نرى مثالاً حيث نقرأ البيانات من كائن تم إلغاء تسلسله.

Depersist.java

 import java.io.*; class Depersist{ public static void main(String args[]){ try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

انتاج:

211 ravi 
قم بتنزيل هذا المثال لإلغاء التسلسل

تسلسل جافا مع الوراثة (علاقة IS-A)

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

تسلسلISA.java

 import java.io.Serializable; class Person implements Serializable{ int id; String name; Person(int id, String name) { this.id = id; this.name = name; } } class Student extends Person{ String course; int fee; public Student(int id, String name, String course, int fee) { super(id,name); this.course=course; this.fee=fee; } } public class SerializeISA { public static void main(String args[]) { try{ //Creating the object Student s1 =new Student(211,'ravi','Engineering',50000); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name+' '+s.course+' '+s.fee); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

انتاج:

 success 211 ravi Engineering 50000 

قامت فئة SerializeISA بإجراء تسلسل لكائن فئة الطالب الذي يمتد إلى فئة الشخص القابلة للتسلسل. يتم توريث خصائص الفئة الأصلية إلى الفئات الفرعية، لذا إذا كانت الفئة الأصلية قابلة للتسلسل، فستكون الفئة الفرعية أيضًا قابلة للتسلسل.

تسلسل جافا مع التجميع (علاقة HAS-A)

إذا كان الفصل يحتوي على مرجع لفئة أخرى، فيجب أن تكون جميع المراجع قابلة للتسلسل وإلا فلن يتم تنفيذ عملية التسلسل. في مثل هذه الحالة، NotSerializableException يتم طرحها في وقت التشغيل.

java

 class Address{ String addressLine,city,state; public Address(String addressLine, String city, String state) { this.addressLine=addressLine; this.city=city; this.state=state; } } 

Student.java

بيان التبديل جافا
 import java.io.Serializable; public class Student implements Serializable{ int id; String name; Address address;//HAS-A public Student(int id, String name) { this.id = id; this.name = name; } } 

نظرًا لأن العنوان غير قابل للتسلسل، فلا يمكنك إجراء تسلسل لمثيل فئة الطالب.

ملاحظة: يجب أن تكون جميع الكائنات الموجودة داخل الكائن قابلة للتسلسل.

تسلسل Java مع عضو البيانات الثابتة

إذا كان هناك أي عضو بيانات ثابت في الفصل، فلن يتم إجراء تسلسل له، لأن الثابت هو جزء من الفصل وليس كائنًا.

الموظف.جافا

 class Employee implements Serializable{ int id; String name; static String company='SSS IT Pvt Ltd';//it won't be serialized public Student(int id, String name) { this.id = id; this.name = name; } } 

تسلسل جافا مع مجموعة أو مجموعة

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

قابل للتحويل إلى الخارج في جافا

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

توفر الواجهة القابلة للتحويل طريقتين:

    public void writeExternal(ObjectOutput out) يلقي IOException قراءة الفراغ العام (ObjectInput in) يلقي IOException

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

إذا كنت لا ترغب في إجراء تسلسل لأي عضو بيانات في الفصل الدراسي، فيمكنك وضع علامة عليه على أنه عابر.

الموظف.جافا

 class Employee implements Serializable{ transient int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

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

قم بزيارة الصفحة التالية لمزيد من التفاصيل.

SerialVersionUID

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

 private static final long serialVersionUID=1L; 

الآن، ستبدو الفئة القابلة للتسلسل كما يلي:

الموظف.جافا

 import java.io.Serializable; class Employee implements Serializable{ private static final long serialVersionUID=1L; int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } }