الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

نبذة عن ال Serialization في الجافا

بدأه herch في 26 يناير 2010 · 10 رد · 7,210 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ال 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);
	}
}

تم تعديل هذه المشاركة بواسطة herch في 26 يناير 2010 في 18:40

8
#2

أشكرك جزيل الشكر أخي الكريم فعلاً موضوع قيم ومهم


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#3

أهلا وسهلا :)

#4

شكرا جزيلا ....

#5

السلام عليكم ,,

جميل جداً :)

و السحر هذا كله يتم باستخدام الـ Reflection :cool:

#6

شكرا للجميع :)

Khaled.Alshaya كتب:

و السحر هذا كله يتم باستخدام الـ Reflection :cool:

هنك أيضا طريقة أخرى تقوم بالتخزين على شكل XML باستعمال الفئة XMLEncoder و XMLDecoder.

#7

بارك الله فيك وجزاك الف خير

لقد تمكنت من اضافة object الي الملف ولكن عندي مازال عندي مشكلة في استرجاع ال object من الملف

شكرا على هذا الشرح الرائع

#8
اقتباس
هنك أيضا طريقة أخرى تقوم بالتخزين على شكل XML باستعمال الفئة XMLEncoder و XMLDecoder.

مثال

تم تعديل هذه المشاركة بواسطة {هويدي} في 5 مارس 2010 في 17:49

#9

شكرا يا عصام عل الموضوع ...

تم تعديل هذه المشاركة بواسطة MKSoft في 5 مارس 2010 في 18:25

#10
hamida كتب:

بارك الله فيك وجزاك الف خير

لقد تمكنت من اضافة object الي الملف ولكن عندي مازال عندي مشكلة في استرجاع ال object من الملف

شكرا على هذا الشرح الرائع

 

طبعا الخطأ الذي وقعت فيه هنا أنك تريد ارجاع القيم للمتغيرات و هي private

لحل هذه المشكلة طبعا إما أنك تجعل المتغيرات public في الكلاس Person

أو الأفضل لتطبيق مفهوم ال Object Oriented أن تكتب set methods و get methods

#11

جميل جدا شرحك وتوصيلك للمعلومة

 

بارك الله فيك

مواضيع مشابهة