English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعليمات Java الأساسية

Java Flow Control

Java Arrays

Java Object-Oriented (I)

Java Object-Oriented (II)

Java Object-Oriented (III)

معالجة الاستثناءات Java

Java List

Java Queue (Queue)

Java Map Collections

Java Set Collections

Java Input/Output (I/O)

Java Reader/Writer

مواضيع Java أخرى

Java التسلسل

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

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

كل عملية مستقلة عن محرك Java الافتراضي (JVM)، مما يعني أن العناصر التي يتم تسلسلها على منصة يمكن تفعيلها على منصة أخرى مختلفة تمامًا.

فئات ObjectInputStream و ObjectOutputStream هي بيانات عالية المستوى، وتحتوي على طرق تسلسل وتفعيل العناصر.

يحتوي Class ObjectOutputStream على العديد من طرق الكتابة لكتابة أنواع البيانات المختلفة، ولكن هناك طريقة استثنائية:

public final void writeObject(Object x) throws IOException

يتم تسلسل الجسم في الطريقة أعلاه، ويتم إرساله إلى流出. يحتوي ObjectInputStream على طريقة تسلسل الجسم كالتالي:

public final Object readObject() throws IOException 
                                 ClassNotFoundException

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

لإظهار كيف يعمل التسلسل في Java، سأستخدم فئة Employee التي ذكرتها في الدروس السابقة، افتراضًا أننا قمنا بتعريف فئة Employee كما يلي، وهي تنفذ واجهة Serializable.

public class Employee implements java.io.Serializable
{
   public String name;
   public String address;
   public transient int SSN;
   public int number;
   public void mailCheck()
   {
      System.out.println("إرسال شيك إلى " + name
                           + " " + address);
   }
}

يرجى ملاحظة، يجب أن تكون كلاً من الشروط التالية ممتنعة لتحقيق تسلسل ناجح لأحداث الفئة:

يجب أن تكون الفئة مطابقة لـ java.io.Serializable.

يجب أن تكون جميع الخصائص في الفئة قابلة للتسلسل. إذا كانت خصائص ليست قابلة للتسلسل، يجب أن يتم تحديد هذه الخصائص كـ transient.

إذا كنت ترغب في معرفة ما إذا كانت فئة Java قياسية قابلة للتسلسل، يرجى الرجوع إلى وثائق الفئة.

تسلسل العناصر

يستخدم ObjectOutputter للتحويل إلى تسلسل، مثل مثال SerializeDemo في الأسفل، يتم تحويل عنصر Employee إلى ملف.

بعد تنفيذ هذا البرنامج، يتم إنشاء ملف يسمى employee.ser. لا يوجد أي مخرجات للبرنامج، ولكن يمكنك فهم دور البرنامج من خلال قراءة الكود.

ملاحظة: عند تسلسل عنصر إلى ملف، وفقاً للمعايير القياسية لـ Java، يجب أن يكون لديه امتداد ملف .ser.

import java.io.*;
 
public class SerializeDemo
{
   public static void main(String [] args)
   {
      Employee e = new Employee();
      e.name = "Reyan Ali";
      e.address = "Phokka Kuan, Ambehta Peer";
      e.SSN = 11122333;
      e.number = 101;
      try
      {
         FileOutputStream fileOut =
         new FileOutputStream("/tmp/employee.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
         System.out.printf("تم حفظ البيانات المفصلية في /tmp/employee.ser");
      catch(IOException i)
      {
          i.printStackTrace();
      }
   }
}

تفريغ كائن

برنامج DeserializeDemo التالي يوضح عملية تفريغ التسلسل، يحتوي ملف /tmp/employee.ser على كائن Employee.

import java.io.*;
 
public class DeserializeDemo
{
   public static void main(String [] args)
   {
      Employee e = null;
      try
      {
         FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject();
         in.close();
         fileIn.close();
      catch(IOException i)
      {
         i.printStackTrace();
         return;
      catch(ClassNotFoundException c)
      {
         System.out.println("لم يتم العثور على فئة Employee");
         c.printStackTrace();
         return;
      }
      System.out.println("Deserialized Employee...");
      System.out.println("اسم: " + e.name);
      System.out.println("عنوان: " + e.address);
      System.out.println("الرقم الاجتماعي: " + e.SSN);
      System.out.println("رقم: " + e.number);
    }
}

نتائج التجميع والتنفيذ للبرنامج أعلاه كالتالي:

تفريغ Employee...
الاسم:Reyan Ali
عنوان:Phokka Kuan, Ambehta Peer
SSN: 0
رقم:101

لاحظ النقاط التالية:

يحاول مكتبة try/catch في method readObject() التقاطع من استثناء ClassNotFoundException. للجافا فيbility لتسلسل الكائن، يجب أن تكون الفئة قابلة العثور عليها. إذا لم يجد JVM الفئة أثناء عملية التفريغ، فإنه يرفع استثناء ClassNotFoundException.

لاحظ أن قيمة العودة لـ method readObject() قد تحولت إلى إشارة إلى Employee.

عندما يتم تسلسل الكائن، قيمة الخاصية SSN هي 111222333، ولكن لأن هذه الخاصية مؤقتة، لم يتم إرسال هذه القيمة إلى تدفق الإخراج. لذلك، يصبح قيمة خاصية SSN لـ Employee بعد التفريغ 0.