ال serialization هي تخزين كائن عندما يكون في حالة معينة، سواء في القرض الصلب أو إرساله عبر الشبكة إلى جهاز آخر.
ال serialization تعتمد على ثلاث عناصر:
- ال interface Serializable: هذه ال interface هي التي نحدد بواسطتها ما إذا كانت فئة ما قابلة لل serialization أو لا.
- ObjectOutputStream: هذه الفئة هي المسؤولة عن كتابة الكائن الذي نريد تخزينه.
- ObjectInputStream: هذه الفئة هي المسؤولة عن قراءة الكائن الذي نريد استرجاعه.
ال interface Serializable
إذا كنا ننوي عمل serialization للكائنات الخاصة بفئة ما، فيجب علينا أن نقوم عند كتابة هذه الفئة بعمل implements لل interface Serializable. هذه ال interface لا تحتوي على اي طريقة method أو خاصية attribute، والهدف منها هو تحديد الفئات القابلة لعملية ال serialization.
قلنا في البداية أن ال serialization هي تخزين كائن عندما يكون في حالة معينة، وما يحدد حالة كائن ما هي قيمة خصائصه attributes، وبالتالي فإن عمل serialization لكائن ما يتمثل بالأساس في تخزين كل خصائصه.
لكن هناك بعض القيود:
- الخاصية يجب أن تكون كائنا من فئة تقبل ال serialization، أو أن تكون من ال primitive types.
- الخاصية يجب أن لا تكون static.
- الخاصية يجب أن لا تكون transient.
transient هو modifier يتيح لنا منع ال serialization بالنسبة لخاصية ما، أي أنه لن يتم تخزين قيمتها.
الفئة 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("Ahmed", 40, "182 zaza 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("Ahmed", 40, "182 zaza street");
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.srz"));
out.writeObject(p);
out.close();
}
}الفئة 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);
ونحصل على نفس المعطيات
Ahmed
40
182 zaza 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);
}
}
