ObjectOutputStream ב-Java – כתיבת Object לקובץ

ObjectOutputStream ב-Java ניתן להשתמש כדי להמיר אובייקט ל-OutputStream. התהליך של המרת אובייקט לזרם נקרא serialization ב-Java. לאחר שאובייקט הומר ל-Output Stream, ניתן לשמור אותו בקובץ או במסד נתונים, לשלוח דרך הרשת או להשתמש בחיבורי Socket. לכן, ניתן להשתמש ב-FileOutputStream כדי לכתוב אובייקט לקובץ.

ObjectOutputStream

ObjectOutputStream הוא חלק ממחלקות Java IO ומטרתו העיקרית היא לספק לנו דרך להמיר אובייקט Java לזרם. כאשר אנו יוצרים מופע של 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 עבור כל המאפיינים או לקבל בנאי ללא ארגומנטים. כפי שאתה רואה, לאובייקט העובד אין שיטות getter/setter עבור המאפיין "שם". גם אין לו בנאי ללא ארגומנטים. הנה התוכנית שמציגה איך לכתוב אובייקט לקובץ ב-Java באמצעות 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 לכתיבה וקריאת פעולות אובייקט. אף על פי שאין חובה להיות לשדה זה, אך כדאי לשמור עליו. אחרת, בכל פעם שתשנה את המחלקה שלך זה לא ישפיע על אובייקטים סדורים קודמים, הם יתחילו לנפול. לניתוח מפורט, עבור אל סדרה ב-Java. אם אתה תוהה אם התוכנית שלנו עבדה כשורה או לא, השתמש בקוד הבא כדי לקרוא אובייקט מהקובץ שמור.

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());
//פלט יהיה "עובד:: שם=Pankaj גיל=35 מגדר=זכר תפקיד=מנכ"ל"

כל זה על java ObjectOutputStream וכיצד להשתמש בו כדי לכתוב את האובייקט לקובץ.

ניתן לבדוק דוגמאות נוספות של Java IO במאגר הקוד שלנו ב-GitHub Repository.

הפנייה: API Doc

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