تسلسل الكائنات في Java: دليل شامل للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

تسلسل الكائنات في Java: ما هو ولماذا هو مطلوب؟



التسلسل في Java هو عملية تحويل حالة كائن إلى تدفق من البايتات لحفظها في ملف أو قاعدة بيانات أو نقلها عبر الشبكة. العملية العكسية - استعادة الكائن من تدفق البايتات - تسمى إلغاء التسلسل. هذه التقنية هي أساس العديد من أطر عمل Java: من RMI (استدعاء الأسلوب عن بُعد) إلى أنظمة تبادل الرسائل.



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



كيف يعمل التسلسل في Java؟



توفر Java آلية تسلسل مدمجة من خلال واجهة java.io.Serializable. هذه الواجهة لا تحتوي على طرق - فهي واجهة علامة (marker interface). إذا قامت فئة بتطبيق Serializable، فإن JVM تسمح تلقائيًا بتسلسل كائناتها.



لتسجيل وقراءة الكائنات، يتم استخدام فئتين رئيسيتين من حزمة java.io:



  • ObjectOutputStream - تسلسل الكائن إلى تدفق بايتات
  • ObjectInputStream - إلغاء تسلسل الكائن من تدفق البايتات


مثال بسيط على التسلسل



لنقم بإنشاء فئة Person التي يمكن تسلسلها:



import java.io.Serializable;

public class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; private transient String password; // لن يتم تسلسله

public Person(String name, int age, String password) { this.name = name; this.age = age; this.password = password; }

@Override public String toString() { return "Person{name='" + name + "', age=" + age + ", password='" + password + "'}"; }}


الآن لنكتب الكود للتسلسل وإلغاء التسلسل:



import java.io.*;

public class SerializationDemo { public static void main(String[] args) { Person person = new Person("إيفان", 30, "secret123"); // التسلسل try (FileOutputStream fos = new FileOutputStream("person.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos)) { oos.writeObject(person); System.out.println("تم تسلسل الكائن: " + person); } catch (IOException e) { e.printStackTrace(); }

// إلغاء التسلسل try (FileInputStream fis = new FileInputStream("person.ser"); ObjectInputStream ois = new ObjectInputStream(fis)) { Person restoredPerson = (Person) ois.readObject(); System.out.println("تم استعادة الكائن: " + restoredPerson); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } }}


مخرجات البرنامج:

تم تسلسل الكائن: Person{name='إيفان', age=30, password='secret123'}تم استعادة الكائن: Person{name='إيفان', age=30, password='null'}


لاحظ: تم وضع علامة على الحقل password بالكلمة المفتاحية transient وعند إلغاء التسلسل حصل على القيمة null. هذه هي الطريقة القياسية لاستبعاد البيانات الحساسة من التسلسل.



ميزات هامة للتسلسل في Java



  • serialVersionUID - معرف فريد لإصدار الفئة. إذا لم يتم التصريح عنه صراحةً، ستقوم JVM بإنشائه تلقائيًا، ولكن هذا قد يؤدي إلى خطأ InvalidClassException عند تغيير الفئة. يُوصى دائمًا بالتصريح عن private static final long serialVersionUID.
  • الحقول الثابتة لا يتم تسلسلها - فهي تنتمي إلى الفئة وليس إلى الكائن.
  • الكائنات المتداخلة - إذا كان الكائن القابل للتسلسل يحتوي على مراجع لكائنات أخرى

توصيات