مقال : ما هي عملية الـ Serialization في لغة جافا ؟ كيف نقوم بها ؟

السلام عليكم و رحمة الله و بركاته


 ما هي عملية الـ Serialization ؟
الـ Serialization عبارة عن آلية تسمح بحفظ الكائنات في storage medium أي وسيلة تخزين مثل الملفات أو ذاكرات التخزين المؤقت (memory buffer) كما تُمكن أيضا من نقل الكائنات عبر شبكات الاتصال, تم دعمها في الجافا ابتداء من النسخة 1.1 من الـ JDK, تسمح هذه الآلية بالحفاظ على الـ Object Persistence حيث تُنقل الكائنات عبر binary support على شكل مجموعة من الـ bytes أو على شكل قابل للقراءة مثل ملفات XML. الـ format المستخدم لحفظ الكائنات لا علاقة له بنظام التشغيل حيث يُمكن إعادة بناء الكائن (تُسمى هذه العملية بـ deserialization) في نظام تشغيل مختلف عن الذي تمت فيه عملية الـserialization.

أثناء هذه العملية, يُمكن تخزين الكائنات على القرص الصلب أو في قاعدة بيانات كما يُمكن أيضاً إعادة بنائها في جهاز آخر في الشبكة حيث تتم إعادة إنشائها باستخدام الـ JVM الموجودة في الجهاز المستقبِل. (كما تفعل RMI مثلا)
في هذه المقالة, سنشرح كيفية عمل الـ binary serialization مع العلم أنه يُمكن عمل الـ XML serialization في الجافا باستخدام الفئتين XMLEncoder و XMLDecoder حيث يتم تخزين البيانات بصيغة XML.

كيف نقوم بالـ Serialization
تعتمد الـ serialization على الـ streams لذا يجب أن تكون لديك معرفة مُسبقة بمعظم الفئات الموجودة في الحزمة java.io و كيفية التعامل معها.
 تُوفر الـ Java API الأدوات اللازمة لعمل الـ serialization و هي :

  1. interface Serializable: هذه ال interface هي التي نحدد بواسطتها ما إذا كانت فئة ما قابلة لل serialization أو لا.
  2. ObjectOutputStream: هذه الفئة هي المسؤولة عن كتابة الكائن الذي نريد تخزينه.
  3. ObjectInputStream: هذه الفئة هي المسؤولة عن قراءة الكائن الذي نريد استرجاعه.

شرح مفصل لكل واحدة  :

1. interface Serializable :
إذا كنا ننوي عمل serialization للكائنات الخاصة بفئة ما، فيجب علينا أن نقوم عند كتابة هذه الفئة بعمل implements لل interface Serializable. هذه ال interface لا تحتوي على اي طريقة method أو خاصية attribute،
والهدف منها هو تحديد الفئات القابلة لعملية ال serialization.
قلنا في البداية أن ال serialization هي تخزين كائن عندما يكون في حالة معينة، وما يحدد حالة كائن ما هي قيمة خصائصه attributes، وبالتالي فإن عمل serialization لكائن ما يتمثل بالأساس في تخزين كل خصائصه.
لكن هناك بعض القيود:
  • الخاصية يجب أن تكون كائنا من فئة تقبل ال serialization، أو أن تكون من ال primitive types.
  • الخاصية يجب أن لا تكون static.
  • الخاصية يجب أن لا تكون transient, transient هو modifier يتيح لنا منع ال serialization بالنسبة لخاصية ما، أي أنه لن يتم تخزين قيمتها.
2. ObjectOutputStream :

هذه الفئة هي المسؤولة عن تخزين الكائن. عملية التخزين سهلة، ولا تتعدى النداء على الطريقة writeObject وتمرير الكائن الذي نريد تخزينه.

مثال

لدينا الفئة Person التي نريد تخزين بعض كائناتها، لذلك نعمل implements لل interface Serializable

import java.io.Serializable;
public class Person implements Serializable {
private String name;
private int age;
private String address;
public Person(String name, int age, String address) {
this.name = name;
this.address = address;
this.age = age;
}
}

الآن ننشئ كائن ObjectOutputStream، ونمرر لل constructor ال stream الذي نريد الكتابة إليه. بما أننا سنكتب في ملف فإننا سنستعمل FileOutputStream.

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.srz"));
ثم نقوم بتخزين كائن Person

Person p = new Person("Munaf", 60, "108 xxxxx street");
out.writeObject(p);
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class SerializeObject {
 public static void main(String[] args) throws FileNotFoundException, IOException {
  Person p = new Person("Munaf", 60, "108 xxxxx street");
  ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.srz"));
  out.writeObject(p);
  out.close();
 }
}

3. ObjectInputStream :

هذه الفئة هي المسؤولة عن استرجاع الكائن الذي قمنا بتخزينه، باستخدام الطريقة readObject.

أولا ننشئ كائن ObjectInputStream، ونمرر لل constructor ال stream الذي سنقرا منه. بما أننا خزنا الكائن في ملف فإننا سنستعمل FileInputStream.

ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.srz"));
ثم نسترجع الكائن Person

Person p = (Person) in.readObject();
ثم نتحقق أن الكائن الذي استرجعنا هو نفسه الكائن الذي خزناه سابقا

System.out.println(p.name);
System.out.println(p.age);
System.out.println(p.address);
ونحصل على نفس المعطيات

Munaf

60

108 xxxxx street

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class DeserializeObject {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.srz"));
Person p = (Person) in.readObject();
in.close();
System.out.println(p.name);
System.out.println(p.age);
System.out.println(p.address);
}
}



اتمنى الشرح كان واضحا وسهل الفهم .. القاكم في دروس قادمة انشالله الى اللقاء..

مقال : ما هي عملية الـ Serialization في لغة جافا ؟ كيف نقوم بها ؟ مقال : ما هي عملية الـ Serialization في لغة جافا ؟ كيف نقوم بها ؟ Reviewed by Munaf Aqeel Mahdi on 2:23 PM Rating: 5

4 comments:

  1. لمادا لم تضع كود تشرح فيه هدا المفهوم؟
    شكرا لك.

    ReplyDelete
    Replies
    1. اخي هذا فقط مجرد مقال بسيط حول Serialization ,اما اذا كنت تريد مثال له ..في الخدمة لامشكلة

      Delete
    2. شكرا لمرورك الكريم صديقي العزيز

      Delete
  2. شكرا لجهودك اخي العزيز انا كنت ابحث عن طريقة لتخزين البيانات في الجافا بحيث تحفظ بعد اغلاق البرنامج وعندما افتحه مرة اخرى اتمكن من اضافة كائنات جديدة دون حذف ما تم حفظه في المرة السابقة وهكذا ,, يا ليت لو تشرح لنا كيف يمكن تحقيق مثل هذه المهمة وهل يمكن تنفيذها باستخدام Serialization ام غير الية وشكرا

    ReplyDelete

Powered by Blogger.