اذهب إلى المحتوى
  • 0

كيف نتعامل مع التسلسل Serialization في لغة جافا java

Abdul Malik Essa

السؤال

Recommended Posts

  • 1

Serialization: التسلسل هو عملية ترجمة بنية بيانات أو حالة كائن إلى تنسيق يمكن تخزينه أو نقله وإعادة بنائه لاحقًا.

في جافا يمكننا تحويل أي بنية معطيات لسلسلة من البايتات، ممت يمكننا من لإرسال البيانات ضمن قنوات الاتصال عبر الشبكة أو تخزين ونقل المعطيات، ونرسلها لحاسوب آخر ثم نقوم بعكس العملية للحصول على البيانات الأصلية.

يستعمل التسلسل عادة مع الأغراض لنقل بياناتها.

طريقة البرمجة، على صنف الغرض الذي نريد عمل Serialization له أن يحقق الواجهة Serializable:

class Muclass implements Serializable {
	...
}

وتضمين المكتبة:

import java.io.Serializable;

والمكتبتبني التاليتين مثلا في حال أردنا كتابة الغرض في ملف:

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

ومثال على دالة تقوم بعمل Serialization وتكتب البيانات في ملف:

private static void writeObject(Serializable shoe) throws IOException { 

	ObjectOutputStream oos = 
		new ObjectOutputStream( new FileOutputStream(new File("obj.ser")));

	oos.writeObject(shoe);
	oos.close();
}

ولقراءة الغرض:

private static Object readObject() throws IOException, ClassNotFoundException {

	ObjectInputStream ois = 
		new ObjectInputStream( new FileInputStream(new File("obj.ser")));
	
	Object obj = ois.readObject();
	return obj;
}

مثال كامل من توثيق w3resources: w3resource.com/java-serialization.

ليكن لدينا صنف عامل يحقق الواجهة:Serializable

public class Employee implements java.io.Serializable {
   public String name;
   public String address;
   public transient int SSN;
   public int number;
   
   public void mailCheck() {
      System.out.println("Mailing a check to " + name + " " + address);
   }
}

ولدينا الصنف التالي الذي قوم باختبار عمل السلسلة للكائن من الصنف السابق:

import java.io.*;
public class MySerialize {

   public static void main(String [] args) {
      Employee e = new Employee();
      e.name = "my name";
      e.address = "syria, damascus";
      e.SSN = 1;
      e.number = 100;
      
      try {
         FileOutputStream fileOut =
         new FileOutputStream("/serilas/employee.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
         System.out.printf("Serialized data is saved in serilas/employee.ser");
      } catch (IOException i) {
         i.printStackTrace();
      }
   }
}

ولإعادة البيانات من الملف نعمل De-serialize:

import java.io.*;
public class MyDeserialize {

   public static void main(String [] args) {
      Employee e = null;
      try {
         FileInputStream fileIn = new FileInputStream("/serilas/employee.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject();
         in.close();
         fileIn.close();
      } catch (IOException i) {
         i.printStackTrace();
         return;
      } catch (ClassNotFoundException c) {
         System.out.println("Employee class not found");
         c.printStackTrace();
         return;
      }
      
      System.out.println("Deserialized Employee...");
      System.out.println("Name: " + e.name);
      System.out.println("Address: " + e.address);
      System.out.println("SSN: " + e.SSN);
      System.out.println("Number: " + e.number);
   }
}

 

serialize-deserialize-java.png

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

لتحقيق ال Serialization نستخدم الكلاس ObjectOutputStream لإنشاء نسخة من الكائن الموجود في الذاكرة و وضعها في ملف .

يجب القيام بالخطوات التالية :
1 - الكائن الذي تريد حفظ حالته يجب أن يكون في الأساس محققا للواجهة Serializable .
( ملاحظة الواجهة Serializable هي واجهة معرفة في الجافا ولاتحوي أي طرائق ومن اجل تحقيقها يجب كتابة تعليمة الاستيراد للصفوف import java.io.Serializable ).
2 - إنشاء ملف إمتداده ser بواسطة الكلاس FileOutputStream.
3 - تجهيز كائن من الكلاس ObjectOutputStream الذي يستخدم لكتابة حالة الكائن في الملف .
4 - نسخ حالة الكائن الموجود في الذاكرة في هذا الملف بواسطة الدالة writeObject() .
5 - عند الإنتهاء من عملية النسخ نقوم بقطع كل إتصال قمنا بإجرائه مع هذا الملف .
مثال : ليكن لدينا كلاس يعبر عن طالب حقوله الاسم والرقم والمطلوب القيام ب Serialization.

import java.io.Serializable;
public class Student implements Serializable {
  String name;
  int id;
  public Student(String name,int id){
    this.name=name;
    this.id=id;
  }
  
  public void printInformation(){
    System.out.println("name: "+name+" id: "+id);
  }
  
}

الان في main سوف نعرض باقي خطوات السلسة :

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class Session2 {

	public static void main(String[] args) {
		Student st=new Student("Alel",1);
		
    try {

   		 FileOutputStream fs = new FileOutputStream("teat.ser");

    	 ObjectOutputStream os = new ObjectOutputStream(fs);

    	 os.writeObject(st);

   		 os.close();
   	    } catch(Exception ex) {
	         ex.printStackTrace();
	      }
   }
}


عند تنفيذ الخطوات السابقة ينشأ ملف بالاسم test.ser

test.png.06adb2a553c93bc875054d4ba3a3d348.png

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...