ObjectOutputStream في جافا – كتابة الكائن إلى ملف

تستخدم ObjectOutputStream في Java لتحويل كائن إلى OutputStream. عملية تحويل الكائن إلى تدفق تسمى التسلسل في جافا. بمجرد تحويل الكائن إلى Output Stream، يمكن حفظه في ملف أو قاعدة بيانات، أو إرساله عبر الشبكة أو استخدامه في اتصالات الجواكت. لذا يمكننا استخدام FileOutputStream لكتابة الكائن إلى ملف.

ObjectOutputStream

ObjectOutputStream هو جزء من فئات Java IO وغرضه الرئيسي هو توفير وسيلة لتحويل كائن جافا إلى تدفق. عند إنشاء مثيل من ObjectOutputStream، يجب علينا توفير OutputStream المستخدم. يتم استخدام هذا OutputStream بواسطة ObjectOutputStream لقناة تدفق الكائن إلى التدفق الناتج الأساسي، على سبيل المثال، FileOutputStream.

متطلبات ObjectOutputStream

الكائن الذي نريد تسلسله يجب أن ينفذ واجهة java.io.Serializable . Serializable هي مجرد واجهة علامة ولا تحتوي على أي طريقة مجردة يجب علينا تنفيذها. سنحصل على java.io.NotSerializableException إذا لم تقم الفئة بتنفيذ واجهة Serializable. شيء مثل ما هو موجود في تتبع استثناء أدناه.

java.io.NotSerializableException: com.journaldev.files.EmployeeObject
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
	at com.journaldev.files.ObjectOutputStreamExample.main(ObjectOutputStreamExample.java:21)

مثال Java ObjectOutputStream لكتابة كائن إلى ملف

لنلق نظرة على مثال Java ObjectOutputStream لكتابة كائن إلى ملف. لهذا، يجب أولاً أن يكون لدينا فئة مع بعض الخصائص. دعنا ننشئ كائنًا سنقوم بحفظه في الملف.

package com.journaldev.files;

import java.io.Serializable;

public class Employee implements Serializable {

	private static final long serialVersionUID = -299482035708790407L;

	private String name;
	private String gender;
	private int age;

	private String role;
	// private transient String role;

	public Employee(String n) {
		this.name = n;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getRole() {
		return role;
	}

	public void setRole(String role) {
		this.role = role;
	}

	@Override
	public String toString() {
		return "Employee:: Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender + " Role=" + this.role;
	}

}

لاحظ أنه ليس شرطًا أن يكون لدينا getter/setter لجميع الخصائص. أو أن يكون لدينا بناء بدون وسيط constructor. كما يمكنك رؤية أن الكائن Employee أعلاه ليس لديه طرق getter/setter لخاصية “name”. ولا يحتوي أيضًا على بناء بدون وسيط. فيما يلي البرنامج الذي يوضح كيفية كتابة كائن إلى ملف في جافا باستخدام ObjectOutputStream.

package com.journaldev.files;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class ObjectOutputStreamExample {

	public static void main(String[] args) {
		Employee emp = new Employee("Pankaj");

		emp.setAge(35);
		emp.setGender("Male");
		emp.setRole("CEO");
		System.out.println(emp);
		
		try {
			FileOutputStream fos = new FileOutputStream("EmployeeObject.ser");
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			// كتابة كائن إلى ملف
			oos.writeObject(emp);
			System.out.println("Done");
			// إغلاق الموارد
			oos.close();
			fos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

الصورة أدناه تُظهر نتائج البرنامج السابق. إذا كنت تتساءل عن محتوى ملف EmployeeObject.ser، فإنه مشوش قليلاً ويشبه ما يلي.

��srcom.journaldev.files.Employee�����yyIageLgendertLjava/lang/String;Lnameq~Lroleq~xp#tMaletPankajtCEO

ObjectOutputStream مع كلمة مفتاحية transient

إذا لم نرغب في تحويل خاصية كائن ما إلى تسلسل، يجب علينا استخدام الكلمة المفتاحية transient لذلك. على سبيل المثال، قم بتغيير خاصية الدور كما يلي ولن يتم حفظها.

private transient String role;

ObjectOutputStream وserialVersionUID

هل لاحظت الـ serialVersionUID المعرف في كائن الموظف؟ يُستخدم من قبل فئتي ObjectOutputStream و ObjectInputStream لعمليات كتابة وقراءة الكائنات. على الرغم من أنه ليس إلزاميًا وجود هذا الحقل، إلا أنه يجب الاحتفاظ به. وإلا فكلما قمت بتغيير صنفك الذي لا يؤثر على الكائنات المتسلسلة سابقًا، فإنه سيبدأ في الفشل. لمزيد من التحليل التفصيلي، انتقل إلى التسلسل في جافا. إذا كنت تتساءل عما إذا كان برنامجنا يعمل بشكل صحيح أم لا، استخدم الكود أدناه لقراءة كائن من الملف المحفوظ.

FileInputStream is = new FileInputStream("EmployeeObject.ser");
ObjectInputStream ois = new ObjectInputStream(is);
Employee emp = (Employee) ois.readObject();

ois.close();
is.close();
System.out.println(emp.toString());
//الناتج سيكون "Employee:: Name=Pankaj Age=35 Gender=Male Role=CEO"

هذا كل شيء عن ObjectOutputStream في جافا وكيفية استخدامه لكتابة الكائن إلى ملف.

يمكنك التحقق من أمثلة أخرى لـ Java IO من مستودعنا على GitHub.

المرجع: وثائق الواجهة البرمجية

Source:
https://www.digitalocean.com/community/tutorials/objectoutputstream-java-write-object-file