السلام عليكم و رحمة الله و بركاته
ما هي عملية الـ 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 :
إذا كنا ننوي عمل serialization للكائنات الخاصة بفئة ما، فيجب علينا أن نقوم عند كتابة هذه الفئة بعمل implements لل interface Serializable. هذه ال interface لا تحتوي على اي طريقة method أو خاصية attribute،
والهدف منها هو تحديد الفئات القابلة لعملية ال serialization.
قلنا في البداية أن ال serialization هي تخزين كائن عندما يكون في حالة معينة، وما يحدد حالة كائن ما هي قيمة خصائصه attributes، وبالتالي فإن عمل serialization لكائن ما يتمثل بالأساس في تخزين كل خصائصه.
لكن هناك بعض القيود:
هذه الفئة هي المسؤولة عن تخزين الكائن. عملية التخزين سهلة، ولا تتعدى النداء على الطريقة writeObject وتمرير الكائن الذي نريد تخزينه.
مثال
لدينا الفئة Person التي نريد تخزين بعض كائناتها، لذلك نعمل implements لل interface Serializable
الآن ننشئ كائن ObjectOutputStream، ونمرر لل constructor ال stream الذي نريد الكتابة إليه. بما أننا سنكتب في ملف فإننا سنستعمل FileOutputStream.
3. ObjectInputStream :
هذه الفئة هي المسؤولة عن استرجاع الكائن الذي قمنا بتخزينه، باستخدام الطريقة readObject.
أولا ننشئ كائن ObjectInputStream، ونمرر لل constructor ال stream الذي سنقرا منه. بما أننا خزنا الكائن في ملف فإننا سنستعمل FileInputStream.
Munaf
60
108 xxxxx street
اتمنى الشرح كان واضحا وسهل الفهم .. القاكم في دروس قادمة انشالله الى اللقاء..
ما هي عملية الـ 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 و هي :
- interface Serializable: هذه ال interface هي التي نحدد بواسطتها ما إذا كانت فئة ما قابلة لل serialization أو لا.
- ObjectOutputStream: هذه الفئة هي المسؤولة عن كتابة الكائن الذي نريد تخزينه.
- ObjectInputStream: هذه الفئة هي المسؤولة عن قراءة الكائن الذي نريد استرجاعه.
شرح مفصل لكل واحدة :
1. interface Serializable :
إذا كنا ننوي عمل serialization للكائنات الخاصة بفئة ما، فيجب علينا أن نقوم عند كتابة هذه الفئة بعمل implements لل interface Serializable. هذه ال interface لا تحتوي على اي طريقة method أو خاصية attribute،
والهدف منها هو تحديد الفئات القابلة لعملية ال serialization.
قلنا في البداية أن ال serialization هي تخزين كائن عندما يكون في حالة معينة، وما يحدد حالة كائن ما هي قيمة خصائصه attributes، وبالتالي فإن عمل serialization لكائن ما يتمثل بالأساس في تخزين كل خصائصه.
لكن هناك بعض القيود:
- الخاصية يجب أن تكون كائنا من فئة تقبل ال serialization، أو أن تكون من ال primitive types.
- الخاصية يجب أن لا تكون static.
- الخاصية يجب أن لا تكون transient, transient هو modifier يتيح لنا منع ال serialization بالنسبة لخاصية ما، أي أنه لن يتم تخزين قيمتها.
هذه الفئة هي المسؤولة عن تخزين الكائن. عملية التخزين سهلة، ولا تتعدى النداء على الطريقة 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 في لغة جافا ؟ كيف نقوم بها ؟
Reviewed by Munaf Aqeel Mahdi
on
2:23 PM
Rating:
لمادا لم تضع كود تشرح فيه هدا المفهوم؟
ReplyDeleteشكرا لك.
اخي هذا فقط مجرد مقال بسيط حول Serialization ,اما اذا كنت تريد مثال له ..في الخدمة لامشكلة
Deleteشكرا لمرورك الكريم صديقي العزيز
Deleteشكرا لجهودك اخي العزيز انا كنت ابحث عن طريقة لتخزين البيانات في الجافا بحيث تحفظ بعد اغلاق البرنامج وعندما افتحه مرة اخرى اتمكن من اضافة كائنات جديدة دون حذف ما تم حفظه في المرة السابقة وهكذا ,, يا ليت لو تشرح لنا كيف يمكن تحقيق مثل هذه المهمة وهل يمكن تنفيذها باستخدام Serialization ام غير الية وشكرا
ReplyDelete